Skip to content

Commit fd32347

Browse files
committed
Support for a global pool
1 parent 7c1ec95 commit fd32347

4 files changed

Lines changed: 50 additions & 20 deletions

File tree

src/main/java/org/jvnet/hudson/plugins/port_allocator/Pool.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,21 @@
66
* @author pepov
77
*/
88
public class Pool {
9-
10-
public String name;
11-
public String ports;
129

13-
public int[] getPortsAsInt() {
10+
public boolean global;
11+
public String name;
12+
public String ports;
1413

15-
String[] portsItemsAsString = ports.split(",");
14+
public int[] getPortsAsInt() {
1615

17-
int[] portsItems = new int[portsItemsAsString.length];
16+
String[] portsItemsAsString = ports.split(",");
1817

19-
for (int i = 0; i < portsItemsAsString.length; i++) {
20-
portsItems[i] = Integer.parseInt(portsItemsAsString[i]);
21-
}
18+
int[] portsItems = new int[portsItemsAsString.length];
2219

23-
return portsItems;
24-
}
20+
for (int i = 0; i < portsItemsAsString.length; i++) {
21+
portsItems[i] = Integer.parseInt(portsItemsAsString[i]);
22+
}
23+
24+
return portsItems;
25+
}
2526
}

src/main/java/org/jvnet/hudson/plugins/port_allocator/PortAllocator.java

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,32 @@
22

33
import hudson.Extension;
44
import hudson.Launcher;
5-
import hudson.model.*;
5+
import hudson.model.BuildListener;
6+
import hudson.model.AbstractBuild;
7+
import hudson.model.Computer;
8+
import hudson.model.Descriptor;
9+
import hudson.model.Executor;
610
import hudson.tasks.BuildWrapper;
711
import hudson.util.FormValidation;
12+
13+
import java.io.IOException;
14+
import java.io.PrintStream;
15+
import java.util.ArrayList;
16+
import java.util.HashMap;
17+
import java.util.HashSet;
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.regex.Pattern;
21+
22+
import jenkins.model.Jenkins;
23+
import jenkins.model.Jenkins.MasterComputer;
824
import net.sf.json.JSONObject;
25+
926
import org.apache.commons.logging.Log;
1027
import org.apache.commons.logging.LogFactory;
1128
import org.kohsuke.stapler.QueryParameter;
1229
import org.kohsuke.stapler.StaplerRequest;
1330

14-
import java.io.IOException;
15-
import java.io.PrintStream;
16-
import java.util.*;
17-
import java.util.regex.Pattern;
18-
1931
/**
2032
* Allocates TCP Ports on a Computer for consumption and sets it as
2133
* environment variables, see configuration
@@ -39,7 +51,8 @@ private PortAllocator(PortType[] ports){
3951
@Override
4052
public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException {
4153
PrintStream logger = listener.getLogger();
42-
54+
55+
final Computer master = Jenkins.getInstance().toComputer();
4356
final Computer cur = Executor.currentExecutor().getOwner();
4457
Map<String,Integer> prefPortMap = new HashMap<String,Integer>();
4558
if (build.getPreviousBuild() != null) {
@@ -49,14 +62,22 @@ public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener l
4962
prefPortMap = prevAlloc.getPreviousAllocatedPorts();
5063
}
5164
}
65+
final PortAllocationManager mpam = PortAllocationManager.getManager(master);
5266
final PortAllocationManager pam = PortAllocationManager.getManager(cur);
5367
Map<String,Integer> portMap = new HashMap<String,Integer>();
5468
final List<Port> allocated = new ArrayList<Port>();
5569

5670
for (PortType pt : ports) {
57-
logger.println("Allocating TCP port "+pt.name);
71+
boolean global = false;
72+
try {
73+
Pool pool = PortAllocator.DESCRIPTOR.getPoolByName(pt.name);
74+
global = pool.global;
75+
} catch (PoolNotDefinedException e) {
76+
// ignore, global = false
77+
}
78+
logger.println("Allocating TCP port "+pt.name + (global ? " (global)" : ""));
5879
int prefPort = prefPortMap.get(pt.name)== null?0:prefPortMap.get(pt.name);
59-
Port p = pt.allocate(build, pam, prefPort, launcher, listener);
80+
Port p = pt.allocate(build, global ? mpam : pam, prefPort, launcher, listener);
6081
allocated.add(p);
6182
portMap.put(pt.name,p.get());
6283
logger.println(" -> Assigned "+p.get());

src/main/resources/org/jvnet/hudson/plugins/port_allocator/PortAllocator/global.jelly

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
<f:entry title="Pool definitions">
99
<f:repeatable var="pool" items="${descriptor.pools}">
1010
<table width="100%">
11+
<f:entry title="Global" help="/plugin/port-allocator/help-pool-definition-global.html">
12+
<f:checkbox name="pool.global" checked="${pool.global}"/>
13+
</f:entry>
1114
<f:entry title="Name" help="/plugin/port-allocator/help-pool-definition-name.html">
1215
<f:textbox name="pool.name" value="${pool.name}"
1316
checkUrl="'descriptorByName/PortAllocator/checkName?value='+this.value" />
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<div>
2+
<p>
3+
Should this pool allocate unique port numbers globally or per node.
4+
</p>
5+
</div>

0 commit comments

Comments
 (0)