Skip to content

Commit d5e8e94

Browse files
GavinBurris42pdk27
andauthored
Updated Fleet Label Cloud and created tests for CasC (#418)
* Added support for the CreateFleet API * Fixed EC2CreateFleet usage of launch template overrides for retreiving instance type and weight capacity * Added EC2CreateFleet to list of all fleets * Created tests for EC2CreateFleet * Made revisions to EC2CreateFleet. Updated tests to include testing for getStateBatch and isCreateFleet methods * Rename all occurances of EC2Fleet to Fleet, and rename CreateFleet to EC2Fleet * Renaming instances of 'EC2Fleet' to 'Fleet' * Updated comment noting the usage of EC2Fleets as a Fleet * Add permision checks and add missing permissions for EC2Fleets, fleets created by the CreateFleet API * Change the fleet cloud name for the Jenkins CasC field for backwards compatability. Added ggburris to the list of contributors * Removed commented out code and fixed indentations * Changed the fleet label cloud name for the Jenkins CasC field for backwards compatibility * Fixed EC2Fleet naming mistakes * Updated Fleet Label Cloud and created tests for CasC * Change naming ec2Fleet to eC2Fleet for CasC * @change naming ec2FleetLabel to eC2FleetLabel for CasC * Removed testing print statements --------- Co-authored-by: Prathibha Datta Kumar <[email protected]>
1 parent 74a8d88 commit d5e8e94

File tree

6 files changed

+171
-8
lines changed

6 files changed

+171
-8
lines changed

src/main/java/com/amazon/jenkins/ec2fleet/FleetLabelCloud.java

+11-8
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,9 @@ public FleetLabelCloud(final String name,
116116
final boolean privateIpUsed,
117117
final boolean alwaysReconnect,
118118
final Integer idleMinutes,
119-
final Integer minSize,
120-
final Integer maxSize,
121-
final Integer numExecutors,
119+
final int minSize,
120+
final int maxSize,
121+
final int numExecutors,
122122
final boolean restrictUsage,
123123
final boolean disableTaskResubmit,
124124
final Integer initOnlineTimeoutSec,
@@ -136,9 +136,12 @@ public FleetLabelCloud(final String name,
136136
this.idleMinutes = idleMinutes;
137137
this.privateIpUsed = privateIpUsed;
138138
this.alwaysReconnect = alwaysReconnect;
139-
this.minSize = minSize;
139+
if (minSize < 0) {
140+
warning("Cloud parameter 'minSize' can't be less than 0, setting to 0");
141+
}
142+
this.minSize = Math.max(0, minSize);
140143
this.maxSize = maxSize;
141-
this.numExecutors = numExecutors;
144+
this.numExecutors = Math.max(numExecutors, 1);
142145
this.restrictUsage = restrictUsage;
143146
this.disableTaskResubmit = disableTaskResubmit;
144147
this.initOnlineTimeoutSec = initOnlineTimeoutSec;
@@ -204,15 +207,15 @@ public int getIdleMinutes() {
204207
return (idleMinutes != null) ? idleMinutes : 0;
205208
}
206209

207-
public Integer getMaxSize() {
210+
public int getMaxSize() {
208211
return maxSize;
209212
}
210213

211-
public Integer getMinSize() {
214+
public int getMinSize() {
212215
return minSize;
213216
}
214217

215-
public Integer getNumExecutors() {
218+
public int getNumExecutors() {
216219
return numExecutors;
217220
}
218221

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package com.amazon.jenkins.ec2fleet;
2+
3+
import com.amazon.jenkins.ec2fleet.fleet.Fleet;
4+
import com.amazon.jenkins.ec2fleet.fleet.Fleets;
5+
import hudson.plugins.sshslaves.SSHConnector;
6+
import hudson.plugins.sshslaves.verifiers.NonVerifyingKeyVerificationStrategy;
7+
import io.jenkins.plugins.casc.ConfiguratorException;
8+
import io.jenkins.plugins.casc.misc.ConfiguredWithCode;
9+
import io.jenkins.plugins.casc.misc.JenkinsConfiguredWithCodeRule;
10+
import org.junit.Before;
11+
import org.junit.Rule;
12+
import org.junit.Test;
13+
import org.jvnet.hudson.test.JenkinsRule;
14+
15+
import java.util.Arrays;
16+
import java.util.Collections;
17+
import java.util.HashSet;
18+
19+
import static org.junit.Assert.assertEquals;
20+
import static org.junit.Assert.assertFalse;
21+
import static org.junit.Assert.assertNull;
22+
import static org.junit.Assert.assertTrue;
23+
import static org.mockito.ArgumentMatchers.anyString;
24+
import static org.mockito.ArgumentMatchers.nullable;
25+
import static org.mockito.Mockito.mock;
26+
import static org.mockito.Mockito.when;
27+
28+
public class FleetLabelCloudConfigurationAsCodeTest {
29+
@Rule
30+
public JenkinsRule jenkinsRule = new JenkinsConfiguredWithCodeRule();
31+
32+
@Before
33+
public void before() {
34+
final Fleet fleet = mock(Fleet.class);
35+
Fleets.setGet(fleet);
36+
when(fleet.getState(anyString(), anyString(), nullable(String.class), anyString()))
37+
.thenReturn(new FleetStateStats("", 2, FleetStateStats.State.active(), new HashSet<>(Arrays.asList("i-1", "i-2")), Collections.emptyMap()));
38+
}
39+
40+
@Test
41+
@ConfiguredWithCode(
42+
value = "FleetLabelCloud/name-required-configuration-as-code.yml",
43+
expected = ConfiguratorException.class,
44+
message = "error configuring 'jenkins' with class io.jenkins.plugins.casc.core.JenkinsConfigurator configurator")
45+
public void configurationWithNullName_shouldFail() {
46+
}
47+
48+
@Test
49+
@ConfiguredWithCode("FleetLabelCloud/min-configuration-as-code.yml")
50+
public void shouldCreateCloudFromMinConfiguration() {
51+
assertEquals(jenkinsRule.jenkins.clouds.size(), 1);
52+
FleetLabelCloud cloud = (FleetLabelCloud) jenkinsRule.jenkins.clouds.getByName("ec2-fleet-label");
53+
54+
assertEquals("ec2-fleet-label", cloud.name);
55+
assertNull(cloud.getRegion());
56+
assertNull(cloud.getEndpoint());
57+
assertNull(cloud.getFsRoot());
58+
assertFalse(cloud.isPrivateIpUsed());
59+
assertFalse(cloud.isAlwaysReconnect());
60+
assertEquals(cloud.getIdleMinutes(), 0);
61+
assertEquals(cloud.getMinSize(), 0);
62+
assertEquals(cloud.getMaxSize(), 0);
63+
assertEquals(cloud.getNumExecutors(), 1);
64+
assertFalse(cloud.isRestrictUsage());
65+
assertEquals(cloud.getInitOnlineTimeoutSec(), 180);
66+
assertEquals(cloud.getInitOnlineCheckIntervalSec(), 15);
67+
assertEquals(cloud.getCloudStatusIntervalSec(), 10);
68+
assertFalse(cloud.isDisableTaskResubmit());
69+
assertFalse(cloud.isNoDelayProvision());
70+
assertNull(cloud.getEc2KeyPairName());
71+
}
72+
73+
@Test
74+
@ConfiguredWithCode("FleetLabelCloud/max-configuration-as-code.yml")
75+
public void shouldCreateCloudFromMaxConfiguration() {
76+
assertEquals(jenkinsRule.jenkins.clouds.size(), 1);
77+
FleetLabelCloud cloud = (FleetLabelCloud) jenkinsRule.jenkins.clouds.getByName("ec2-fleet-label");
78+
79+
assertEquals("ec2-fleet-label", cloud.name);
80+
assertEquals(cloud.getRegion(), "us-east-2");
81+
assertEquals(cloud.getEndpoint(), "http://a.com");
82+
assertEquals(cloud.getFsRoot(), "my-root");
83+
assertTrue(cloud.isPrivateIpUsed());
84+
assertTrue(cloud.isAlwaysReconnect());
85+
assertEquals(cloud.getIdleMinutes(), 22);
86+
assertEquals(cloud.getMinSize(), 11);
87+
assertEquals(cloud.getMaxSize(), 75);
88+
assertEquals(cloud.getNumExecutors(), 24);
89+
assertFalse(cloud.isRestrictUsage());
90+
assertEquals(cloud.getInitOnlineTimeoutSec(), 267);
91+
assertEquals(cloud.getInitOnlineCheckIntervalSec(), 13);
92+
assertEquals(cloud.getCloudStatusIntervalSec(), 11);
93+
assertTrue(cloud.isDisableTaskResubmit());
94+
assertFalse(cloud.isNoDelayProvision());
95+
assertEquals(cloud.getAwsCredentialsId(), "xx");
96+
assertEquals(cloud.getEc2KeyPairName(), "keyPairName");
97+
98+
SSHConnector sshConnector = (SSHConnector) cloud.getComputerConnector();
99+
assertEquals(sshConnector.getSshHostKeyVerificationStrategy().getClass(), NonVerifyingKeyVerificationStrategy.class);
100+
}
101+
102+
@Test
103+
@ConfiguredWithCode("FleetLabelCloud/empty-name-configuration-as-code.yml")
104+
public void configurationWithEmptyName_shouldUseDefault() {
105+
assertEquals(jenkinsRule.jenkins.clouds.size(), 3);
106+
107+
for (FleetLabelCloud cloud : jenkinsRule.jenkins.clouds.getAll(FleetLabelCloud.class)){
108+
109+
assertTrue(cloud.name.startsWith(FleetLabelCloud.BASE_DEFAULT_FLEET_CLOUD_ID));
110+
assertEquals(("FleetLabelCloud".length() + CloudNames.SUFFIX_LENGTH + 1), cloud.name.length());
111+
}
112+
}
113+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
jenkins:
2+
clouds:
3+
- eC2FleetLabel:
4+
name: ""
5+
- eC2FleetLabel:
6+
name: ""
7+
- eC2FleetLabel:
8+
name: ""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
jenkins:
2+
clouds:
3+
- eC2FleetLabel:
4+
name: ec2-fleet-label
5+
awsCredentialsId: xx
6+
computerConnector:
7+
sshConnector:
8+
credentialsId: cred
9+
sshHostKeyVerificationStrategy:
10+
NonVerifyingKeyVerificationStrategy
11+
region: us-east-2
12+
endpoint: http://a.com
13+
fsRoot: my-root
14+
privateIpUsed: true
15+
alwaysReconnect: true
16+
idleMinutes: 22
17+
minSize: 11
18+
maxSize: 75
19+
numExecutors: 24
20+
restrictUsage: false
21+
initOnlineTimeoutSec: 267
22+
initOnlineCheckIntervalSec: 13
23+
cloudStatusIntervalSec: 11
24+
disableTaskResubmit: true
25+
noDelayProvision: false
26+
ec2KeyPairName: "keyPairName"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
jenkins:
2+
clouds:
3+
- eC2FleetLabel:
4+
name: ec2-fleet-label
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
jenkins:
2+
clouds:
3+
- eC2FleetLabel:
4+
awsCredentialsId: xx
5+
region: us-east-2
6+
idleMinutes: 33
7+
minSize: 15
8+
maxSize: 90
9+
numExecutors: 12

0 commit comments

Comments
 (0)