Created
February 23, 2016 01:14
-
-
Save feliperazeek/faae2fed6aef780442a4 to your computer and use it in GitHub Desktop.
Azkaban Simple Trigger Plugin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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