Skip to content

Instantly share code, notes, and snippets.

@feliperazeek
Created February 23, 2016 01:14
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save feliperazeek/faae2fed6aef780442a4 to your computer and use it in GitHub Desktop.
Save feliperazeek/faae2fed6aef780442a4 to your computer and use it in GitHub Desktop.
Azkaban Simple Trigger Plugin
package azkaban.security;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Period;
import org.joda.time.PeriodType;
import org.joda.time.ReadablePeriod;
import azkaban.executor.ExecutionOptions;
import azkaban.flow.Flow;
import azkaban.project.Project;
import azkaban.sla.SlaOption;
import azkaban.trigger.Condition;
import azkaban.trigger.ConditionChecker;
import azkaban.trigger.Trigger;
import azkaban.trigger.TriggerAction;
import azkaban.trigger.TriggerAgent;
import azkaban.trigger.TriggerManagerException;
import azkaban.trigger.builtin.BasicTimeChecker;
import azkaban.trigger.builtin.ExecuteFlowAction;
import azkaban.utils.Props;
import azkaban.webapp.AzkabanWebServer;
import azkaban.webapp.plugin.TriggerPlugin;
import azkaban.webapp.servlet.AbstractAzkabanServlet;
public class SimpleTriggerPlugin implements TriggerPlugin {
private String pluginName;
private String pluginPath;
private Integer order;
private Boolean hidden;
private AzkabanWebServer web;
public SimpleTriggerPlugin(String pluginName, Props props, org.mortbay.jetty.servlet.Context context,
AzkabanWebServer web) {
try {
System.out.println("Plugin Name: " + pluginName);
System.out.println("Plugin Path: " + pluginPath);
System.out.println("Plugin Order: " + order);
System.out.println("Plugin Hidden: " + hidden);
System.out.println("Plugin Props: " + props);
this.pluginName = pluginName;
this.pluginPath = props.getString("trigger.path", null);
this.order = props.getInt("trigger.order", 0);
this.hidden = props.getBoolean("trigger.hidden", false);
this.web = web;
String source = this.pluginName;
deleteTriggersBySource(source);
String user = "admin";
boolean recurring = true;
boolean skipPastOccurrences = true;
Period period = new Period(1, PeriodType.minutes());
long firstSchedTime = DateTime.now().plusMinutes(1).getMillis();
long submitTime = DateTime.now().getMillis();
long lastModifyTime = DateTime.now().getMillis(); // do we care about keeping this?
Condition triggerCondition = createTimeTriggerCondition(DateTimeZone.UTC, firstSchedTime, recurring,
skipPastOccurrences, period);
Condition expireCondition = createTimeExpireCondition(DateTimeZone.UTC, firstSchedTime, recurring,
skipPastOccurrences, period);
List<TriggerAction> actions = createActions("foo", "simple", user, new ExecutionOptions(),
new ArrayList<SlaOption>());
Trigger trigger = new Trigger(lastModifyTime, submitTime, user, source, triggerCondition,
expireCondition, actions);
if (recurring) {
trigger.setResetOnTrigger(true);
}
try {
web.getTriggerManager().insertTrigger(trigger);
System.out.println("Done creating trigger!");
} catch (TriggerManagerException e) {
System.out.println(ExceptionUtils.getStackTrace(e));
throw new RuntimeException(e.fillInStackTrace());
}
} catch (Throwable e) {
System.out.println(ExceptionUtils.getStackTrace(e));
throw new RuntimeException(e.fillInStackTrace());
}
}
private void deleteTriggersBySource(String source) throws TriggerManagerException {
for (Trigger t : this.web.getTriggerManager().getTriggers(source)) {
this.web.getTriggerManager().removeTrigger(t);
}
}
private Condition createTimeTriggerCondition(DateTimeZone timezone, Long firstSchedTime, boolean recurring,
boolean skipPastOccurrences, ReadablePeriod period) {
Map<String, ConditionChecker> checkers = new HashMap<String, ConditionChecker>();
ConditionChecker checker = new BasicTimeChecker("BasicTimeChecker_1", firstSchedTime, timezone, recurring,
skipPastOccurrences, period);
checkers.put(checker.getId(), checker);
String expr = checker.getId() + ".eval()";
Condition cond = new Condition(checkers, expr);
return cond;
}
// if failed to trigger, auto expire?
private Condition createTimeExpireCondition(DateTimeZone timezone, Long firstSchedTime, boolean recurring,
boolean skipPastOccurrences, ReadablePeriod period) {
Map<String, ConditionChecker> checkers = new HashMap<String, ConditionChecker>();
ConditionChecker checker = new BasicTimeChecker("BasicTimeChecker_2", firstSchedTime, timezone, recurring,
skipPastOccurrences, period);
checkers.put(checker.getId(), checker);
String expr = checker.getId() + ".eval()";
Condition cond = new Condition(checkers, expr);
return cond;
}
private List<TriggerAction> createActions(String projectName, String flowId,
String user, ExecutionOptions exec, List<SlaOption> slas) {
Project p = this.web.getProjectManager().getProject(projectName);
assert (p != null);
Flow f = p.getFlow(flowId);
assert (f != null);
List<TriggerAction> actions = new ArrayList<TriggerAction>();
ExecuteFlowAction executeAct = new ExecuteFlowAction("executeFlowAction", p.getId(), p.getName(), flowId, user,
exec, slas);
actions.add(executeAct);
return actions;
}
@Override
public TriggerAgent getAgent() {
return null;
}
@Override
public String getInputPanelVM() {
return null;
}
@Override
public int getOrder() {
return this.order;
}
@Override
public String getPluginName() {
return this.pluginName;
}
@Override
public String getPluginPath() {
return this.pluginPath;
}
@Override
public AbstractAzkabanServlet getServlet() {
return null;
}
@Override
public boolean isHidden() {
return this.hidden;
}
@Override
public void load() {
}
@Override
public void setHidden(boolean arg0) {
this.hidden = arg0;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment