Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add processAllRules option. #56

Merged
merged 4 commits into from
Oct 17, 2016
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions src/main/java/in/ashwanthkumar/gocd/slack/PipelineListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import in.ashwanthkumar.gocd.slack.ruleset.Rules;
import in.ashwanthkumar.utils.lang.option.Option;

import java.util.List;

abstract public class PipelineListener {
private Logger LOG = Logger.getLoggerFor(PipelineListener.class);
protected Rules rules;
Expand All @@ -17,11 +19,15 @@ public PipelineListener(Rules rules) {
public void notify(GoNotificationMessage message) throws Exception {
message.tryToFixStageResult(rules);
LOG.debug(String.format("Finding rules with state %s", message.getStageResult()));
Option<PipelineRule> ruleOption = rules.find(message.getPipelineName(), message.getStageName(), message.getStageResult());
if (ruleOption.isDefined()) {
PipelineRule pipelineRule = ruleOption.get();
LOG.debug(String.format("Matching rule is %s", pipelineRule));
handlePipelineStatus(pipelineRule, PipelineStatus.valueOf(message.getStageResult().toUpperCase()), message);
List<PipelineRule> foundRules = rules.find(message.getPipelineName(), message.getStageName(), message.getStageResult());
if (foundRules.size() > 0) {
for (PipelineRule pipelineRule : foundRules) {
LOG.debug(String.format("Matching rule is %s", pipelineRule));
handlePipelineStatus(pipelineRule, PipelineStatus.valueOf(message.getStageResult().toUpperCase()), message);
if (! rules.getProcessAllRules()) {
break;
}
}
} else {
LOG.warn(String.format("Couldn't find any matching rule for %s/%s with status=%s", message.getPipelineName(), message.getStageName(), message.getStageResult()));
}
Expand Down
33 changes: 30 additions & 3 deletions src/main/java/in/ashwanthkumar/gocd/slack/ruleset/Rules.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class Rules {
private String goLogin;
private String goPassword;
private boolean displayMaterialChanges;
private boolean processAllRules;

private Proxy proxy;

Expand Down Expand Up @@ -139,6 +140,15 @@ public Rules setDisplayMaterialChanges(boolean displayMaterialChanges) {
return this;
}

public boolean getProcessAllRules() {
return processAllRules;
}

public Rules setProcessAllRules(boolean processAllRules) {
this.processAllRules = processAllRules;
return this;
}

public Proxy getProxy() {
return proxy;
}
Expand All @@ -152,12 +162,23 @@ public PipelineListener getPipelineListener() {
return pipelineListener;
}

public Option<PipelineRule> find(final String pipeline, final String stage, final String pipelineStatus) {
return Lists.find(pipelineRules, new Predicate<PipelineRule>() {
public List<PipelineRule> find(final String pipeline, final String stage, final String pipelineStatus) {
Predicate<PipelineRule> predicate = new Predicate<PipelineRule>() {
public Boolean apply(PipelineRule input) {
return input.matches(pipeline, stage, pipelineStatus);
}
});
};

if(processAllRules) {
return Lists.filter(pipelineRules, predicate);
} else {
List<PipelineRule> found = new ArrayList<PipelineRule>();
Option<PipelineRule> match = Lists.find(pipelineRules, predicate);
if(match.isDefined()) {
found.add(match.get());
}
return found;
}
}

public static Rules fromConfig(Config config) {
Expand Down Expand Up @@ -199,6 +220,11 @@ public static Rules fromConfig(Config config) {
displayMaterialChanges = config.getBoolean("displayMaterialChanges");
}

boolean processAllRules = false;
if (config.hasPath("processAllRules")) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I hate to say this, but can you please switch to - based convention for the config name? I wanted to do the same for displayMaterialChanges as well. Pretty please!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, no problem, I will do that.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done: 391fd0c

processAllRules = config.getBoolean("processAllRules");
}

Proxy proxy = null;
if (config.hasPath("proxy")) {
Config proxyConfig = config.getConfig("proxy");
Expand Down Expand Up @@ -231,6 +257,7 @@ public PipelineRule apply(Config input) {
.setGoLogin(login)
.setGoPassword(password)
.setDisplayMaterialChanges(displayMaterialChanges)
.setProcessAllRules(processAllRules)
.setProxy(proxy);
try {
rules.pipelineListener = Class.forName(config.getString("listener")).asSubclass(PipelineListener.class).getConstructor(Rules.class).newInstance(rules);
Expand Down
86 changes: 40 additions & 46 deletions src/test/java/in/ashwanthkumar/gocd/slack/ruleset/RulesTest.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package in.ashwanthkumar.gocd.slack.ruleset;


import in.ashwanthkumar.gocd.slack.Status;
import in.ashwanthkumar.utils.lang.option.Option;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.HashSet;
import java.util.Set;

Expand All @@ -17,34 +17,30 @@ public class RulesTest {
@Test
public void shouldFindMatch() {
Rules rules = new Rules();
PipelineRule pRules1 = new PipelineRule("pipeline", "stage");
pRules1.setStatus(new HashSet<PipelineStatus>(Arrays.asList(PipelineStatus.PASSED, PipelineStatus.FAILED)));

rules.setPipelineRules(Arrays.asList(
pipelineRule("pipeline1", "stage1", "ch1", statuses(PipelineStatus.BUILDING, PipelineStatus.FAILED)),
pipelineRule("pipeline1", "stage2", "ch2", statuses(PipelineStatus.FIXED, PipelineStatus.PASSED)),
pipelineRule("pipeline2", "stage2", "ch3", statuses(PipelineStatus.CANCELLED, PipelineStatus.BROKEN))
));

Option<PipelineRule> rule1 = rules.find("pipeline1", "stage1", Status.Building.getStatus());
assertThat(rule1.isDefined(), is(true));
assertThat(rule1.get().getNameRegex(), is("pipeline1"));
assertThat(rule1.get().getStageRegex(), is("stage1"));
List<PipelineRule> foundRules1 = rules.find("pipeline1", "stage1", Status.Building.getStatus());
assertThat(foundRules1.size(), is(1));
assertThat(foundRules1.get(0).getNameRegex(), is("pipeline1"));
assertThat(foundRules1.get(0).getStageRegex(), is("stage1"));

Option<PipelineRule> rule2 = rules.find("pipeline2", "stage2", Status.Cancelled.getStatus());
assertThat(rule2.isDefined(), is(true));
assertThat(rule2.get().getNameRegex(), is("pipeline2"));
assertThat(rule2.get().getStageRegex(), is("stage2"));
List<PipelineRule> foundRules2 = rules.find("pipeline2", "stage2", Status.Cancelled.getStatus());
assertThat(foundRules2.size(), is(1));
assertThat(foundRules2.get(0).getNameRegex(), is("pipeline2"));
assertThat(foundRules2.get(0).getStageRegex(), is("stage2"));

Option<PipelineRule> rule3 = rules.find("pipeline2", "stage2", Status.Passed.getStatus());
assertThat(rule3.isDefined(), is(false));
List<PipelineRule> foundRules3 = rules.find("pipeline2", "stage2", Status.Passed.getStatus());
assertThat(foundRules3.size(), is(0));
}

@Test
public void shouldFindMatchWithRegexp() {
Rules rules = new Rules();
PipelineRule pRules1 = new PipelineRule("pipeline", "stage");
pRules1.setStatus(new HashSet<PipelineStatus>(Arrays.asList(PipelineStatus.PASSED, PipelineStatus.FAILED)));

rules.setPipelineRules(Arrays.asList(
pipelineRule("[a-z]*", "[a-z]*", "ch1", statuses(PipelineStatus.BUILDING)),
Expand All @@ -53,46 +49,44 @@ public void shouldFindMatchWithRegexp() {
pipelineRule("\\d*", "[a-z]*", "ch4", statuses(PipelineStatus.BUILDING))
));

Option<PipelineRule> rule1 = rules.find("abc", "efg", Status.Building.getStatus());
assertThat(rule1.isDefined(), is(true));
assertThat(rule1.get().getNameRegex(), is("[a-z]*"));
assertThat(rule1.get().getStageRegex(), is("[a-z]*"));
assertThat(rule1.get().getChannel(), is("ch1"));

Option<PipelineRule> rule2 = rules.find("123", "456", Status.Building.getStatus());
assertThat(rule2.isDefined(), is(true));
assertThat(rule2.get().getNameRegex(), is("\\d*"));
assertThat(rule2.get().getStageRegex(), is("\\d*"));
assertThat(rule2.get().getChannel(), is("ch2"));

Option<PipelineRule> rule3 = rules.find("123", "456", Status.Passed.getStatus());
assertThat(rule3.isDefined(), is(true));
assertThat(rule3.get().getNameRegex(), is("\\d*"));
assertThat(rule3.get().getStageRegex(), is("\\d*"));
assertThat(rule3.get().getChannel(), is("ch3"));

Option<PipelineRule> rule4 = rules.find("pipeline1", "stage1", Status.Passed.getStatus());
assertThat(rule4.isDefined(), is(false));
List<PipelineRule> foundRules1 = rules.find("abc", "efg", Status.Building.getStatus());
assertThat(foundRules1.size(), is(1));
assertThat(foundRules1.get(0).getNameRegex(), is("[a-z]*"));
assertThat(foundRules1.get(0).getStageRegex(), is("[a-z]*"));
assertThat(foundRules1.get(0).getChannel(), is("ch1"));

List<PipelineRule> foundRules2 = rules.find("123", "456", Status.Building.getStatus());
assertThat(foundRules2.size(), is(1));
assertThat(foundRules2.get(0).getNameRegex(), is("\\d*"));
assertThat(foundRules2.get(0).getStageRegex(), is("\\d*"));
assertThat(foundRules2.get(0).getChannel(), is("ch2"));

List<PipelineRule> foundRules3 = rules.find("123", "456", Status.Passed.getStatus());
assertThat(foundRules3.size(), is(1));
assertThat(foundRules3.get(0).getNameRegex(), is("\\d*"));
assertThat(foundRules3.get(0).getStageRegex(), is("\\d*"));
assertThat(foundRules3.get(0).getChannel(), is("ch3"));

List<PipelineRule> foundRules4 = rules.find("pipeline1", "stage1", Status.Passed.getStatus());
assertThat(foundRules4.size(), is(0));
}

@Test
public void shouldFindMatchAll() {
Rules rules = new Rules();
PipelineRule pRules1 = new PipelineRule("pipeline", "stage");
pRules1.setStatus(new HashSet<PipelineStatus>(Arrays.asList(PipelineStatus.PASSED, PipelineStatus.FAILED)));

rules.setPipelineRules(Arrays.asList(
pipelineRule("p1", "s1", "ch1", statuses(PipelineStatus.ALL))
));

assertThat(rules.find("p1", "s1", Status.Building.getStatus()).isDefined(), is(true));
assertThat(rules.find("p1", "s1", Status.Broken.getStatus()).isDefined(), is(true));
assertThat(rules.find("p1", "s1", Status.Cancelled.getStatus()).isDefined(), is(true));
assertThat(rules.find("p1", "s1", Status.Failed.getStatus()).isDefined(), is(true));
assertThat(rules.find("p1", "s1", Status.Failing.getStatus()).isDefined(), is(true));
assertThat(rules.find("p1", "s1", Status.Fixed.getStatus()).isDefined(), is(true));
assertThat(rules.find("p1", "s1", Status.Passed.getStatus()).isDefined(), is(true));
assertThat(rules.find("p1", "s1", Status.Unknown.getStatus()).isDefined(), is(true));
assertThat(rules.find("p1", "s1", Status.Building.getStatus()).size(), is(1));
assertThat(rules.find("p1", "s1", Status.Broken.getStatus()).size(), is(1));
assertThat(rules.find("p1", "s1", Status.Cancelled.getStatus()).size(), is(1));
assertThat(rules.find("p1", "s1", Status.Failed.getStatus()).size(), is(1));
assertThat(rules.find("p1", "s1", Status.Failing.getStatus()).size(), is(1));
assertThat(rules.find("p1", "s1", Status.Fixed.getStatus()).size(), is(1));
assertThat(rules.find("p1", "s1", Status.Passed.getStatus()).size(), is(1));
assertThat(rules.find("p1", "s1", Status.Unknown.getStatus()).size(), is(1));
}

@Test
Expand All @@ -117,4 +111,4 @@ private static Set<PipelineStatus> statuses(PipelineStatus... statuses) {
return new HashSet<PipelineStatus>(Arrays.asList(statuses));
}

}
}