Navigation Menu

Skip to content

Commit

Permalink
Added support for ViewGroup in ViewBasedJobInclusion.
Browse files Browse the repository at this point in the history
This also fixes [JENKINS-24962] as NestedView is based on ViewGroup
  • Loading branch information
emsa23 committed May 13, 2015
1 parent 1b56eee commit c4fd31b
Show file tree
Hide file tree
Showing 6 changed files with 210 additions and 7 deletions.
6 changes: 6 additions & 0 deletions pom.xml
Expand Up @@ -82,6 +82,12 @@
<version>1.18</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>nested-view</artifactId>
<version>1.14</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>credentials</artifactId>
Expand Down
Expand Up @@ -31,6 +31,7 @@
import hudson.util.ListBoxModel;

import java.util.Collection;
import java.util.logging.Logger;
import java.util.regex.PatternSyntaxException;

import jenkins.advancedqueue.DecisionLogger;
Expand All @@ -45,6 +46,8 @@
*/
public class ViewBasedJobInclusionStrategy extends JobInclusionStrategy {

private final static Logger LOGGER = Logger.getLogger(ViewBasedJobInclusionStrategy.class.getName());

@Extension
static public class ViewBasedJobInclusionStrategyDescriptor extends
AbstractJobInclusionStrategyDescriptor<ViewBasedJobInclusionStrategy> {
Expand All @@ -56,12 +59,20 @@ public ViewBasedJobInclusionStrategyDescriptor() {
public ListBoxModel getListViewItems() {
ListBoxModel items = new ListBoxModel();
Collection<View> views = Jenkins.getInstance().getViews();
for (View view : views) {
items.add(view.getDisplayName(), view.getViewName());
}
addViews("", items, views);
return items;
}



private void addViews(String parent, ListBoxModel items, Collection<View> views) {
for (View view : views) {
items.add(parent + view.getDisplayName(), parent + view.getViewName());
if(view instanceof ViewGroup) {
addViews(parent + view.getDisplayName() + "/", items, ((ViewGroup) view).getViews());
}
}
}

};

static public class JobPattern {
Expand All @@ -75,7 +86,7 @@ public JobPattern(String jobPattern) {
}

private String viewName;

private boolean useJobFilter = false;

private String jobPattern = ".*";
Expand All @@ -101,10 +112,26 @@ public String getJobPattern() {
return jobPattern;
}

private View getView() {
String[] nestedViewNames = this.viewName.split("/");
View view = Jenkins.getInstance().getView(nestedViewNames[0]);
if(null == view) {
LOGGER.severe("Configured View does not exixts '" + viewName + "' using primary view");
return Jenkins.getInstance().getPrimaryView();
}
for(int i = 1; i < nestedViewNames.length; i++) {
view = ((ViewGroup) view).getView(nestedViewNames[i]);
if(null == view) {
LOGGER.severe("Configured View does not exixts '" + viewName + "' using primary view");
return Jenkins.getInstance().getPrimaryView();
}
}
return view;
}

@Override
public boolean contains(DecisionLogger decisionLogger, Job<?, ?> job) {
View view = Jenkins.getInstance().getView(viewName);
if (isJobInView(job, view)) {
if (isJobInView(job, getView())) {
if (!isUseJobFilter() || getJobPattern().trim().isEmpty()) {
decisionLogger.addDecisionLog(2, "Not using filter ...");
return true;
Expand Down
30 changes: 30 additions & 0 deletions src/test/java/jenkins/advancedqueue/test/NestedViewTest.java
@@ -0,0 +1,30 @@
package jenkins.advancedqueue.test;

import hudson.cli.BuildCommand.CLICause;
import jenkins.advancedqueue.testutil.ExpectedItem;
import jenkins.advancedqueue.testutil.JobHelper;
import jenkins.advancedqueue.testutil.TestRunListener;

import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.recipes.LocalData;

public class NestedViewTest {

@Rule
public JenkinsRule j = new JenkinsRule();

private JobHelper jobHelper = new JobHelper(j);

@Test
@LocalData
public void nested_view_test() throws Exception {
// Job 0 matches "Nested View A/Nested View B" -> priority is 1
// Job 0 matched nothing -> default priority is 9
TestRunListener.init(new ExpectedItem("Job 0", 1), new ExpectedItem("Job 1", 9));
jobHelper.scheduleProjects(new CLICause(), new CLICause()).go();
j.waitUntilNoActivity();
TestRunListener.assertStartedItems();
}
}
@@ -0,0 +1,107 @@
<?xml version='1.0' encoding='UTF-8'?>
<hudson>
<disabledAdministrativeMonitors>
<string>OldData</string>
</disabledAdministrativeMonitors>
<version>1.520</version>
<numExecutors>0</numExecutors>
<mode>NORMAL</mode>
<useSecurity>true</useSecurity>
<authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
<securityRealm class="hudson.security.SecurityRealm$None"/>
<projectNamingStrategy class="jenkins.model.ProjectNamingStrategy$DefaultProjectNamingStrategy"/>
<workspaceDir>${ITEM_ROOTDIR}/workspace</workspaceDir>
<buildsDir>${ITEM_ROOTDIR}/builds</buildsDir>
<markupFormatter class="hudson.markup.RawHtmlMarkupFormatter">
<disableSyntaxHighlighting>false</disableSyntaxHighlighting>
</markupFormatter>
<jdks/>
<viewsTabBar class="hudson.views.DefaultViewsTabBar"/>
<myViewsTabBar class="hudson.views.DefaultMyViewsTabBar"/>
<clouds/>
<slaves/>
<quietPeriod>5</quietPeriod>
<scmCheckoutRetryCount>0</scmCheckoutRetryCount>
<views>
<hudson.model.AllView>
<owner class="hudson" reference="../../.."/>
<name>All</name>
<filterExecutors>false</filterExecutors>
<filterQueue>false</filterQueue>
<properties class="hudson.model.View$PropertyList"/>
</hudson.model.AllView>
<listView>
<owner class="hudson" reference="../../.."/>
<name>View1</name>
<filterExecutors>false</filterExecutors>
<filterQueue>false</filterQueue>
<properties class="hudson.model.View$PropertyList"/>
<jobNames>
<comparator class="hudson.util.CaseInsensitiveComparator"/>
<string>Job 1</string>
</jobNames>
<jobFilters/>
<columns>
<hudson.views.StatusColumn/>
<hudson.views.WeatherColumn/>
<hudson.views.JobColumn/>
<hudson.views.LastSuccessColumn/>
<hudson.views.LastFailureColumn/>
<hudson.views.LastDurationColumn/>
<hudson.views.BuildButtonColumn/>
<hudson.queueSorter.PrioritySorterJobColumn/>
</columns>
<recurse>false</recurse>
</listView>
<hudson.plugins.nested__view.NestedView plugin="nested-view@1.14">
<owner class="hudson" reference="../../.."/>
<name>Nested View A</name>
<filterExecutors>false</filterExecutors>
<filterQueue>false</filterQueue>
<properties class="hudson.model.View$PropertyList"/>
<views>
<hudson.plugins.nested__view.NestedView>
<owner class="hudson.plugins.nested_view.NestedView" reference="../../.."/>
<name>Nested View B</name>
<filterExecutors>false</filterExecutors>
<filterQueue>false</filterQueue>
<properties class="hudson.model.View$PropertyList"/>
<views>
<listView>
<owner class="hudson" reference="../../.."/>
<name>List View</name>
<filterExecutors>false</filterExecutors>
<filterQueue>false</filterQueue>
<properties class="hudson.model.View$PropertyList"/>
<jobNames>
<comparator class="hudson.util.CaseInsensitiveComparator"/>
<string>Job 0</string>
</jobNames>
<jobFilters/>
<columns>
<hudson.views.StatusColumn/>
<hudson.views.WeatherColumn/>
<hudson.views.JobColumn/>
<hudson.views.LastSuccessColumn/>
<hudson.views.LastFailureColumn/>
<hudson.views.LastDurationColumn/>
<hudson.views.BuildButtonColumn/>
</columns>
<recurse>false</recurse>
</listView>
</views>
<columns>
</columns>
</hudson.plugins.nested__view.NestedView>
</views>
<columns>
<columns/>
</columns>
</hudson.plugins.nested__view.NestedView>
</views>
<primaryView>All</primaryView>
<slaveAgentPort>0</slaveAgentPort>
<label></label>
<nodeProperties/>
<globalNodeProperties/>
</hudson>
@@ -0,0 +1,15 @@
<?xml version='1.0' encoding='UTF-8'?>
<jenkins.advancedqueue.PriorityConfiguration plugin="PrioritySorter@2.3-SNAPSHOT">
<jobGroups class="linked-list">
<jenkins.advancedqueue.JobGroup>
<id>0</id>
<priority>1</priority>
<view>Nested View A/Nested View B</view>
<runExclusive>false</runExclusive>
<useJobFilter>false</useJobFilter>
<jobPattern>.*</jobPattern>
<usePriorityStrategies>false</usePriorityStrategies>
<priorityStrategies/>
</jenkins.advancedqueue.JobGroup>
</jobGroups>
</jenkins.advancedqueue.PriorityConfiguration>
@@ -0,0 +1,18 @@
<?xml version='1.0' encoding='UTF-8'?>
<jenkins.advancedqueue.PrioritySorterConfiguration>
<legacyMode>false</legacyMode>
<legacyMaxPriority>2147483647</legacyMaxPriority>
<legacyMinPriority>-2147483648</legacyMinPriority>
<allowPriorityOnJobs>true</allowPriorityOnJobs>
<strategy class="jenkins.advancedqueue.sorter.strategy.AbsoluteStrategy">
<ifCondition></ifCondition>
<unlessCondition></unlessCondition>
<children/>
<location>
<lineNumber>0</lineNumber>
<columnNumber>0</columnNumber>
</location>
<numberOfPriorities>10</numberOfPriorities>
<defaultPriority>9</defaultPriority>
</strategy>
</jenkins.advancedqueue.PrioritySorterConfiguration>

0 comments on commit c4fd31b

Please sign in to comment.