Skip to content

Commit 32f839c

Browse files
authored
Merge pull request #3 from subos2008/sboschman-master
Support for a global pool of port numbers
2 parents a96a1aa + e56cf06 commit 32f839c

File tree

4 files changed

+50
-20
lines changed

4 files changed

+50
-20
lines changed

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
@@ -4,11 +4,28 @@
44
import hudson.Extension;
55
import hudson.FilePath;
66
import hudson.Launcher;
7-
import hudson.model.*;
7+
import hudson.model.BuildListener;
8+
import hudson.model.AbstractBuild;
9+
import hudson.model.Computer;
10+
import hudson.model.Descriptor;
11+
import hudson.model.Executor;
812
import hudson.tasks.BuildWrapper;
913
import jenkins.tasks.SimpleBuildWrapper;
1014
import hudson.util.FormValidation;
15+
16+
import java.io.IOException;
17+
import java.io.PrintStream;
18+
import java.util.ArrayList;
19+
import java.util.HashMap;
20+
import java.util.HashSet;
21+
import java.util.List;
22+
import java.util.Map;
23+
import java.util.regex.Pattern;
24+
25+
import jenkins.model.Jenkins;
26+
import jenkins.model.Jenkins.MasterComputer;
1127
import net.sf.json.JSONObject;
28+
1229
import org.apache.commons.logging.Log;
1330
import org.apache.commons.logging.LogFactory;
1431
import org.jenkinsci.Symbol;
@@ -19,11 +36,6 @@
1936

2037
import com.google.common.collect.Lists;
2138

22-
import java.io.IOException;
23-
import java.io.PrintStream;
24-
import java.util.*;
25-
import java.util.regex.Pattern;
26-
2739
/**
2840
* Allocates TCP Ports on a Computer for consumption and sets it as
2941
* environment variables, see configuration
@@ -54,7 +66,7 @@ private PortAllocator(PortType[] ports) {
5466

5567
@DataBoundConstructor
5668
public PortAllocator() {
57-
// empty
69+
// empty
5870
}
5971

6072
@DataBoundSetter
@@ -102,6 +114,7 @@ public String[] getPlainports() {
102114
public void setUp(Context context, Run<?, ?> run, FilePath workspace, Launcher launcher, TaskListener taskListener, EnvVars envVars) throws IOException, InterruptedException {
103115
PrintStream logger = taskListener.getLogger();
104116

117+
Computer master = Jenkins.getInstance().toComputer();
105118
Computer cur = workspace.toComputer();
106119
Map<String,Integer> prefPortMap = new HashMap<String,Integer>();
107120
Run<?, ?> prevBuild = run.getPreviousBuild();
@@ -112,14 +125,22 @@ public void setUp(Context context, Run<?, ?> run, FilePath workspace, Launcher l
112125
prefPortMap = prevAlloc.getPreviousAllocatedPorts();
113126
}
114127
}
128+
final PortAllocationManager mpam = PortAllocationManager.getManager(master);
115129
final PortAllocationManager pam = PortAllocationManager.getManager(cur);
116130
Map<String,Integer> portMap = new HashMap<String,Integer>();
117131
final List<Port> allocated = new ArrayList<Port>();
118132

119133
for (PortType pt : ports) {
120-
logger.println("Allocating TCP port "+pt.name);
134+
boolean global = false;
135+
try {
136+
Pool pool = PortAllocator.DESCRIPTOR.getPoolByName(pt.name);
137+
global = pool.global;
138+
} catch (PoolNotDefinedException e) {
139+
// ignore, global = false
140+
}
141+
logger.println("Allocating TCP port "+pt.name + (global ? " (global)" : ""));
121142
int prefPort = prefPortMap.get(pt.name)== null?0:prefPortMap.get(pt.name);
122-
Port p = pt.allocate(run, pam, prefPort, launcher, taskListener);
143+
Port p = pt.allocate(run, global ? mpam : pam, prefPort, launcher, taskListener);
123144
allocated.add(p);
124145
portMap.put(pt.name, p.get());
125146
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
@@ -9,6 +9,9 @@
99
<f:entry title="Pool definitions">
1010
<f:repeatable var="pool" items="${descriptor.pools}">
1111
<table width="100%">
12+
<f:entry title="Global" help="/plugin/port-allocator/help-pool-definition-global.html">
13+
<f:checkbox name="pool.global" checked="${pool.global}"/>
14+
</f:entry>
1215
<f:entry title="Name" help="/plugin/port-allocator/help-pool-definition-name.html">
1316
<f:textbox name="pool.name" value="${pool.name}"
1417
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)