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

[JENKINS-60647] Fix JCasC for minimumNumberOfInstancesTimeRangeConfig #591

Merged
merged 2 commits into from
Apr 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
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
8 changes: 4 additions & 4 deletions src/main/java/hudson/plugins/ec2/ssh/EC2UnixLauncher.java
Original file line number Diff line number Diff line change
Expand Up @@ -416,9 +416,9 @@ private Connection connectToSsh(EC2Computer computer, TaskListener listener, Sla
} catch (IOException e) {
// keep retrying until SSH comes up
logInfo(computer, listener, "Failed to connect via ssh: " + e.getMessage());
// If the computer was set offline because it's not trusted, we avoid persisting in connecting to it.
// The computer is offline for a long period

// If the computer was set offline because it's not trusted, we avoid persisting in connecting to it.
// The computer is offline for a long period
if (computer.isOffline() && StringUtils.isNotBlank(computer.getOfflineCauseReason()) && computer.getOfflineCauseReason().equals(Messages.OfflineCause_SSHKeyCheckFailed())) {
throw new AmazonClientException("The connection couldn't be established and the computer is now offline", e);
} else {
Expand Down Expand Up @@ -448,7 +448,7 @@ public boolean verifyServerHostKey(String hostname, int port, String serverHostK
return template != null && template.getHostKeyVerificationStrategy().getStrategy().verify(computer, new HostKey(serverHostKeyAlgorithm, serverHostKey), listener);
}
}

private static String getEC2HostAddress(EC2Computer computer, SlaveTemplate template) throws InterruptedException {
Instance instance = computer.updateInstanceDescription();
ConnectionStrategy strategy = template.connectionStrategy;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,16 +136,16 @@ public static boolean minimumInstancesActive(
if (passingMidnight) {
if (nowTime.isAfter(fromTime)) {
String today = now.getDayOfWeek().name().toLowerCase();
return minimumNumberOfInstancesTimeRangeConfig.getMinimumNoInstancesActiveTimeRangeDays().get(today);
return minimumNumberOfInstancesTimeRangeConfig.getDay(today);
} else if (nowTime.isBefore(toTime)) {
//We've gone past midnight and want to check yesterday's setting.
String yesterday = now.minusDays(1).getDayOfWeek().name().toLowerCase();
return minimumNumberOfInstancesTimeRangeConfig.getMinimumNoInstancesActiveTimeRangeDays().get(yesterday);
return minimumNumberOfInstancesTimeRangeConfig.getDay(yesterday);
}
} else {
if (nowTime.isAfter(fromTime) && nowTime.isBefore(toTime)) {
String today = now.getDayOfWeek().name().toLowerCase();
return minimumNumberOfInstancesTimeRangeConfig.getMinimumNoInstancesActiveTimeRangeDays().get(today);
return minimumNumberOfInstancesTimeRangeConfig.getDay(today);
}
}
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,35 @@ public class MinimumNumberOfInstancesTimeRangeConfig {

private String minimumNoInstancesActiveTimeRangeFrom;
private String minimumNoInstancesActiveTimeRangeTo;
private Map<String, Boolean> minimumNoInstancesActiveTimeRangeDays;

/* From old configs */
@Deprecated
private transient Map<String, Boolean> minimumNoInstancesActiveTimeRangeDays;

private Boolean monday;
private Boolean tuesday;
private Boolean wednesday;
private Boolean thursday;
private Boolean friday;
private Boolean saturday;
private Boolean sunday;


@DataBoundConstructor
public MinimumNumberOfInstancesTimeRangeConfig() {
}

private static Map<String, Boolean> parseDays(JSONObject days) {
Map<String, Boolean> map = new HashMap<>();
map.put("monday", days.getBoolean("monday"));
map.put("tuesday", days.getBoolean("tuesday"));
map.put("wednesday", days.getBoolean("wednesday"));
map.put("thursday", days.getBoolean("thursday"));
map.put("friday", days.getBoolean("friday"));
map.put("saturday", days.getBoolean("saturday"));
map.put("sunday", days.getBoolean("sunday"));
return map;
protected Object readResolve() {
if (minimumNoInstancesActiveTimeRangeDays != null && !minimumNoInstancesActiveTimeRangeDays.isEmpty()) {
this.monday = minimumNoInstancesActiveTimeRangeDays.get("monday");
this.tuesday = minimumNoInstancesActiveTimeRangeDays.get("tuesday");
this.wednesday = minimumNoInstancesActiveTimeRangeDays.get("wednesday");
this.thursday = minimumNoInstancesActiveTimeRangeDays.get("thursday");
this.friday = minimumNoInstancesActiveTimeRangeDays.get("friday");
this.saturday = minimumNoInstancesActiveTimeRangeDays.get("saturday");
this.sunday = minimumNoInstancesActiveTimeRangeDays.get("sunday");
}
return this;
}

private static LocalTime getLocalTime(String value) {
Expand All @@ -47,7 +60,7 @@ private static LocalTime getLocalTime(String value) {

public static void validateLocalTimeString(String value) {
if (getLocalTime(value) == null) {
throw new IllegalArgumentException("Value " + value + " is not valid time format, ([h:mm a] or [HH:mm])");
throw new IllegalArgumentException("Value " + value + " is not valid time format, ([12:34 AM] or [23:45])");
}
}

Expand Down Expand Up @@ -79,12 +92,79 @@ public LocalTime getMinimumNoInstancesActiveTimeRangeToAsTime() {
return getLocalTime(minimumNoInstancesActiveTimeRangeTo);
}

public Map<String, Boolean> getMinimumNoInstancesActiveTimeRangeDays() {
return minimumNoInstancesActiveTimeRangeDays;
public Boolean getMonday() {
return monday;
}

@DataBoundSetter
public void setMonday(Boolean monday) {
this.monday = monday;
}

public Boolean getTuesday() {
return tuesday;
}

@DataBoundSetter
public void setTuesday(Boolean tuesday) {
this.tuesday = tuesday;
}

public Boolean getWednesday() {
return wednesday;
}

@DataBoundSetter
public void setWednesday(Boolean wednesday) {
this.wednesday = wednesday;
}

public Boolean getThursday() {
return thursday;
}

@DataBoundSetter
public void setMinimumNoInstancesActiveTimeRangeDays(JSONObject minimumNoInstancesActiveTimeRangeDays) {
this.minimumNoInstancesActiveTimeRangeDays = parseDays(minimumNoInstancesActiveTimeRangeDays);
public void setThursday(Boolean thursday) {
this.thursday = thursday;
}

public Boolean getFriday() {
return friday;
}

@DataBoundSetter
public void setFriday(Boolean friday) {
this.friday = friday;
}

public Boolean getSaturday() {
return saturday;
}

@DataBoundSetter
public void setSaturday(Boolean saturday) {
this.saturday = saturday;
}

public Boolean getSunday() {
return sunday;
}

@DataBoundSetter
public void setSunday(Boolean sunday) {
this.sunday = sunday;
}

public boolean getDay(String day) {
switch (day.toLowerCase()) {
case "monday": return Boolean.TRUE.equals(this.monday);
case "tuesday": return Boolean.TRUE.equals(this.tuesday);
case "wednesday": return Boolean.TRUE.equals(this.wednesday);
case "thursday": return Boolean.TRUE.equals(this.thursday);
case "friday": return Boolean.TRUE.equals(this.friday);
case "saturday": return Boolean.TRUE.equals(this.saturday);
case "sunday": return Boolean.TRUE.equals(this.sunday);
default: throw new IllegalArgumentException("Can only get days");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,14 @@
THE SOFTWARE.
-->
<div>
Paste the RSA private key of the EC2 key pair. You can use the AWS Console
or any other tool of your choice to generate the key pair.
A credential of the type "SSH Username with private key" with the RSA
private key of the EC2 key pair. You can use the AWS Console
or any other tool of your choice to generate the key pair.
The username is used, and the credential should not have a passphrase.

<p>
An RSA private key for EC2 is a text
that starts with "-----BEGIN RSA PRIVATE KEY-----". You normally
generate it via using either the AWS Management Console, the "ec2-add-keypair" tool or a GUI tool
like ElastiFox.
</div>
<p>
An RSA private key for EC2 is a text
that starts with "-----BEGIN RSA PRIVATE KEY-----". You normally
generate it via using either the AWS Management Console, the "ec2-add-keypair" tool or a GUI tool
like ElastiFox.
</div>
31 changes: 11 additions & 20 deletions src/main/resources/hudson/plugins/ec2/SlaveTemplate/config.jelly
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ THE SOFTWARE.
<f:textbox />
</f:entry>

<f:dropdownDescriptorSelector title="${%AMI Type}" field="amiType" descriptors="${descriptor.getAMITypeDescriptors()}" />
<f:dropdownDescriptorSelector title="${%AMI Type}" field="amiType" descriptors="${descriptor.getAMITypeDescriptors()}" />

<f:entry title="${%Labels}" field="labelString">
<f:textbox />
Expand Down Expand Up @@ -161,24 +161,15 @@ THE SOFTWARE.
From: <f:textbox style="width: 25%;" field="minimumNoInstancesActiveTimeRangeFrom" value="${instance.minimumNumberOfInstancesTimeRangeConfig.minimumNoInstancesActiveTimeRangeFrom}" />
To: <f:textbox style="width: 25%;" field="minimumNoInstancesActiveTimeRangeTo" value="${instance.minimumNumberOfInstancesTimeRangeConfig.minimumNoInstancesActiveTimeRangeTo}" />
</f:entry>
<f:rowSet name="minimumNoInstancesActiveTimeRangeDays">
<f:entry title="${%On days}" >
<f:checkbox field="monday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.minimumNoInstancesActiveTimeRangeDays.monday}"/>
<label>${%Monday}</label>
<f:checkbox field="tuesday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.minimumNoInstancesActiveTimeRangeDays.tuesday}"/>
<label>${%Tuesday}</label>
<f:checkbox field="wednesday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.minimumNoInstancesActiveTimeRangeDays.wednesday}"/>
<label>${%Wednesday}</label>
<f:checkbox field="thursday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.minimumNoInstancesActiveTimeRangeDays.thursday}"/>
<label>${%Thursday}</label>
<f:checkbox field="friday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.minimumNoInstancesActiveTimeRangeDays.friday}"/>
<label>${%Friday}</label>
<f:checkbox field="saturday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.minimumNoInstancesActiveTimeRangeDays.saturday}"/>
<label>${%Saturday}</label>
<f:checkbox field="sunday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.minimumNoInstancesActiveTimeRangeDays.sunday}"/>
<label>${%Sunday}</label>
</f:entry>
</f:rowSet>
<f:entry title="${%On days}">
<f:checkbox field="monday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.monday}" title="${%Monday}"/><st:nbsp/><st:nbsp/>
<f:checkbox field="tuesday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.tuesday}" title="${%Tuesday}"/><st:nbsp/><st:nbsp/>
<f:checkbox field="wednesday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.wednesday}" title="${%Wednesday}"/><st:nbsp/><st:nbsp/>
<f:checkbox field="thursday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.thursday}" title="${%Thursday}"/><st:nbsp/><st:nbsp/>
<f:checkbox field="friday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.friday}" title="${%Friday}"/><st:nbsp/><st:nbsp/>
<f:checkbox field="saturday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.saturday}" title="${%Saturday}"/><st:nbsp/><st:nbsp/>
<f:checkbox field="sunday" checked="${instance.minimumNumberOfInstancesTimeRangeConfig.sunday}" title="${%Sunday}"/><st:nbsp/><st:nbsp/>
</f:entry>
</f:optionalBlock>
<f:entry />

Expand Down Expand Up @@ -221,7 +212,7 @@ THE SOFTWARE.
<f:entry title="${%Host Key Verification Strategy}" field="hostKeyVerificationStrategy">
<f:select default="${descriptor.defaultHostKeyVerificationStrategy}"/>
</f:entry>

<f:entry title="${%Maximum Total Uses}" field="maxTotalUses">
<f:textbox default="-1"/>
</f:entry>
Expand Down
33 changes: 33 additions & 0 deletions src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package hudson.plugins.ec2;

import java.time.LocalTime;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
Expand All @@ -17,13 +18,16 @@
import static io.jenkins.plugins.casc.misc.Util.toYamlString;
import static io.jenkins.plugins.casc.misc.Util.toStringFromYamlFile;

import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig;

import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;

public class ConfigurationAsCodeTest {

Expand Down Expand Up @@ -160,6 +164,35 @@ public void testConfigAsCodeWithAltEncpointExport() throws Exception {
assertEquals(expected, exported);
}

@Test
@ConfiguredWithCode("Unix-withMinimumInstancesTimeRange.yml")
public void testConfigAsCodeWithMinimumInstancesTimeRange() throws Exception {
final AmazonEC2Cloud ec2Cloud = (AmazonEC2Cloud) Jenkins.get().getCloud("ec2-timed");
assertNotNull(ec2Cloud);
assertTrue(ec2Cloud.isUseInstanceProfileForCredentials());

final List<SlaveTemplate> templates = ec2Cloud.getTemplates();
assertEquals(1, templates.size());
final SlaveTemplate slaveTemplate = templates.get(0);
assertEquals("ami-123456", slaveTemplate.getAmi());
assertEquals("/home/ec2-user", slaveTemplate.remoteFS);

assertEquals("linux ubuntu", slaveTemplate.getLabelString());
assertEquals(2, slaveTemplate.getLabelSet().size());

final MinimumNumberOfInstancesTimeRangeConfig timeRangeConfig = slaveTemplate.getMinimumNumberOfInstancesTimeRangeConfig();
assertNotNull(timeRangeConfig);
assertEquals(LocalTime.parse("01:00"), timeRangeConfig.getMinimumNoInstancesActiveTimeRangeFromAsTime());
assertEquals(LocalTime.parse("13:00"), timeRangeConfig.getMinimumNoInstancesActiveTimeRangeToAsTime());
assertFalse(timeRangeConfig.getDay("monday"));
assertTrue(timeRangeConfig.getDay("tuesday"));
assertFalse(timeRangeConfig.getDay("wednesday"));


assertTrue(ec2Cloud.canProvision(new LabelAtom("ubuntu")));
assertTrue(ec2Cloud.canProvision(new LabelAtom("linux")));
}

@Test
@ConfiguredWithCode("Ami.yml")
public void testAmi() throws Exception {
Expand Down
Loading