From 64241278962507ff0d8917448bd2c326aea48f89 Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Thu, 3 Sep 2020 01:33:48 +0530 Subject: [PATCH 01/26] Add Support for Host Tenancy Option --- README.md | 2 + .../hudson/plugins/ec2/EC2AbstractSlave.java | 8 +- .../hudson/plugins/ec2/EC2OndemandSlave.java | 16 ++-- .../java/hudson/plugins/ec2/EC2SpotSlave.java | 2 +- .../hudson/plugins/ec2/SlaveTemplate.java | 51 ++++++++---- .../plugins/ec2/util/EC2AgentConfig.java | 12 +++ .../plugins/ec2/util/EC2AgentFactoryImpl.java | 2 +- .../plugins/ec2/EC2Computer/configure.jelly | 4 + .../plugins/ec2/SlaveTemplate/config.jelly | 4 + .../SlaveTemplate/help-useHostTenancy.html | 30 +++++++ .../plugins/ec2/EC2AbstractSlaveTest.java | 6 +- .../plugins/ec2/EC2OndemandSlaveTest.java | 4 +- .../plugins/ec2/EC2RetentionStrategyTest.java | 16 ++-- .../plugins/ec2/EC2SlaveMonitorTest.java | 4 +- .../hudson/plugins/ec2/SlaveTemplateTest.java | 82 ++++++++++++------- .../plugins/ec2/SlaveTemplateUnitTest.java | 4 +- .../plugins/ec2/TemplateLabelsTest.java | 2 +- .../SshHostKeyVerificationStrategyTest.java | 5 +- .../ec2/util/EC2AgentFactoryMockImpl.java | 6 +- .../hudson/plugins/ec2/UnixDataExport.yml | 1 + 20 files changed, 178 insertions(+), 83 deletions(-) create mode 100644 src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-useHostTenancy.html diff --git a/README.md b/README.md index 05deffe3a..5552ffc88 100644 --- a/README.md +++ b/README.md @@ -322,6 +322,7 @@ def SlaveTemplateUsEast1Parameters = [ tmpDir: '', type: 't2.medium', useDedicatedTenancy: false, + useHostTenancy: false, useEphemeralDevices: true, usePrivateDnsName: true, userData: '', @@ -408,6 +409,7 @@ SlaveTemplate slaveTemplateUsEast1 = new SlaveTemplate( SlaveTemplateUsEast1Parameters.deleteRootOnTermination, SlaveTemplateUsEast1Parameters.useEphemeralDevices, SlaveTemplateUsEast1Parameters.useDedicatedTenancy, + SlaveTemplateUsEast1Parameters.useHostTenancy, SlaveTemplateUsEast1Parameters.launchTimeoutStr, SlaveTemplateUsEast1Parameters.associatePublicIp, SlaveTemplateUsEast1Parameters.customDeviceMapping, diff --git a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java index e7de4ca74..75d779ec5 100644 --- a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java @@ -93,6 +93,7 @@ public abstract class EC2AbstractSlave extends Slave { public final boolean stopOnTerminate; public final String idleTerminationMinutes; public final boolean useDedicatedTenancy; + public final boolean useHostTenancy; public boolean isConnected = false; public List tags; public final String cloudName; @@ -140,7 +141,7 @@ public abstract class EC2AbstractSlave extends Slave { public static final String TEST_ZONE = "testZone"; - public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) + public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) throws FormException, IOException { super(name, remoteFS, launcher); @@ -161,6 +162,7 @@ public EC2AbstractSlave(String name, String instanceId, String templateDescripti this.tags = tags; this.usePrivateDnsName = connectionStrategy == ConnectionStrategy.PRIVATE_DNS; this.useDedicatedTenancy = useDedicatedTenancy; + this.useHostTenancy = useHostTenancy; this.cloudName = cloudName; this.launchTimeout = launchTimeout; this.amiType = amiType; @@ -170,9 +172,9 @@ public EC2AbstractSlave(String name, String instanceId, String templateDescripti } @Deprecated - public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) + public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); + this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); } @Override diff --git a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java index 756d06948..c6d82aff8 100644 --- a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java @@ -36,27 +36,27 @@ public class EC2OndemandSlave extends EC2AbstractSlave { @Deprecated public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, launchTimeout, amiType); + this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, false, launchTimeout, amiType); } @Deprecated - public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) + public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, useDedicatedTenancy, launchTimeout, amiType); + this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType); } @Deprecated - public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) + public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(templateDescription + " (" + instanceId + ")", instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, Collections.emptyList(), remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); + this(templateDescription + " (" + instanceId + ")", instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, Collections.emptyList(), remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); } @DataBoundConstructor - public EC2OndemandSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) + public EC2OndemandSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) throws FormException, IOException { super(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, amiType.isWindows() ? new EC2WindowsLauncher() - : new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, launchTimeout, amiType, connectionStrategy, maxTotalUses); + : new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, connectionStrategy, maxTotalUses); this.publicDNS = publicDNS; this.privateDNS = privateDNS; @@ -66,7 +66,7 @@ public EC2OndemandSlave(String name, String instanceId, String templateDescripti * Constructor for debugging. */ public EC2OndemandSlave(String instanceId) throws FormException, IOException { - this(instanceId, instanceId, "debug", "/tmp/hudson", 1, "debug", Mode.NORMAL, "", "/tmp", Collections.emptyList(), null, null, false, null, "Fake public", "Fake private", null, null, false, 0, new UnixData(null, null, null, null), ConnectionStrategy.PRIVATE_IP, -1); + this(instanceId, instanceId, "debug", "/tmp/hudson", 1, "debug", Mode.NORMAL, "", "/tmp", Collections.emptyList(), null, null, false, null, "Fake public", "Fake private", null, null, false, false, 0, new UnixData(null, null, null, null), ConnectionStrategy.PRIVATE_IP, -1); } /** diff --git a/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java b/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java index 6a9fee8d2..32d5492cc 100644 --- a/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java @@ -51,7 +51,7 @@ public EC2SpotSlave(String name, String spotInstanceRequestId, String templateDe throws FormException, IOException { super(name, "", templateDescription, remoteFS, numExecutors, mode, labelString, amiType.isWindows() ? new EC2WindowsLauncher() : - new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, false, idleTerminationMinutes, tags, cloudName, false, launchTimeout, amiType, connectionStrategy, maxTotalUses); + new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, false, idleTerminationMinutes, tags, cloudName, false, false,launchTimeout, amiType, connectionStrategy, maxTotalUses); this.name = name; this.spotInstanceRequestId = spotInstanceRequestId; diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index 2fc2ee180..e841c0204 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -293,6 +293,8 @@ public class SlaveTemplate implements Describable { public final boolean useDedicatedTenancy; + public final boolean useHostTenancy; + public AMITypeData amiType; public int launchTimeout; @@ -338,7 +340,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, List> nodeProperties, HostKeyVerificationStrategyEnum hostKeyVerificationStrategy) { @@ -374,6 +376,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri this.associatePublicIp = associatePublicIp; this.connectionStrategy = connectionStrategy == null ? ConnectionStrategy.PRIVATE_IP : connectionStrategy; this.useDedicatedTenancy = useDedicatedTenancy; + this.useHostTenancy = useHostTenancy; this.connectBySSHProcess = connectBySSHProcess; this.maxTotalUses = maxTotalUses; this.nodeProperties = new DescribableList<>(Saveable.NOOP, Util.fixNull(nodeProperties)); @@ -415,7 +418,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, List> nodeProperties) { @@ -424,7 +427,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, minimumNumberOfSpareInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, + useEphemeralDevices, useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, nodeProperties, null); @@ -436,13 +439,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses,List> nodeProperties ) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, + useEphemeralDevices, useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, nodeProperties); } @@ -452,13 +455,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, + useEphemeralDevices, useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, Collections.emptyList()); } @@ -468,13 +471,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses); } @@ -484,13 +487,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, boolean monitoring, boolean t2Unlimited) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, connectUsingPublicIp, associatePublicIp), -1); } @@ -499,12 +502,12 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, connectUsingPublicIp, false, false); } @@ -513,12 +516,12 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, + boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, false, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, false); + useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, false); } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, @@ -526,11 +529,11 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { + boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, false); + useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, false); } /** @@ -545,7 +548,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, new UnixData(rootCommandPrefix, slaveCommandPrefix, slaveCommandSuffix, sshPort), jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, - useEphemeralDevices, false, launchTimeoutStr, false, null); + useEphemeralDevices, false,false, launchTimeoutStr, false, null); } public boolean isConnectBySSHProcess() { @@ -702,6 +705,10 @@ public boolean getUseDedicatedTenancy() { return useDedicatedTenancy; } + public boolean getUseHostTenancy() { + return useHostTenancy; + } + public Set getLabelSet() { return labelSet; } @@ -905,6 +912,13 @@ HashMap> makeRunInstancesRequestAndFilters(int diFilters.add(new Filter("availability-zone").withValues(getZone())); } + if (getUseHostTenancy()) { + Placement placement = new Placement(); + placement.setTenancy("host"); + riRequest.setPlacement(placement); + diFilters.add(new Filter("tenancy").withValues(placement.getTenancy())); + } + String subnetId = chooseSubnetId(rotateSubnet); InstanceNetworkInterfaceSpecification net = new InstanceNetworkInterfaceSpecification(); @@ -1410,6 +1424,7 @@ protected EC2OndemandSlave newOndemandSlave(Instance inst) throws FormException, .withTags(EC2Tag.fromAmazonTags(inst.getTags())) .withCloudName(parent.name) .withUseDedicatedTenancy(useDedicatedTenancy) + .withUseHostTenancy(useHostTenancy) .withLaunchTimeout(getLaunchTimeout()) .withAmiType(amiType) .withConnectionStrategy(connectionStrategy) diff --git a/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java b/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java index d09f3bbcf..7b6ad5c51 100644 --- a/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java +++ b/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java @@ -57,6 +57,7 @@ public static class OnDemand extends EC2AgentConfig { final String publicDNS; final String privateDNS; final boolean useDedicatedTenancy; + final boolean useHostTenancy; private OnDemand(OnDemandBuilder builder) { super(builder); @@ -65,6 +66,7 @@ private OnDemand(OnDemandBuilder builder) { this.publicDNS = builder.getPublicDNS(); this.privateDNS = builder.getPrivateDNS(); this.useDedicatedTenancy = builder.isUseDedicatedTenancy(); + this.useHostTenancy = builder.isUseHostTenancy(); } } @@ -205,6 +207,7 @@ public static class OnDemandBuilder extends Builder { private String publicDNS; private String privateDNS; private boolean useDedicatedTenancy; + private boolean useHostTenancy; public OnDemandBuilder withInstanceId(String instanceId) { this.instanceId = instanceId; @@ -251,6 +254,15 @@ public boolean isUseDedicatedTenancy() { return useDedicatedTenancy; } + public OnDemandBuilder withUseHostTenancy(boolean useHostTenancy) { + this.useHostTenancy = useHostTenancy; + return this; + } + + public boolean isUseHostTenancy() { + return useHostTenancy; + } + @Override protected OnDemandBuilder self() { return this; diff --git a/src/main/java/hudson/plugins/ec2/util/EC2AgentFactoryImpl.java b/src/main/java/hudson/plugins/ec2/util/EC2AgentFactoryImpl.java index 9b3a8fca4..16bdd2458 100644 --- a/src/main/java/hudson/plugins/ec2/util/EC2AgentFactoryImpl.java +++ b/src/main/java/hudson/plugins/ec2/util/EC2AgentFactoryImpl.java @@ -12,7 +12,7 @@ public class EC2AgentFactoryImpl implements EC2AgentFactory { @Override public EC2OndemandSlave createOnDemandAgent(EC2AgentConfig.OnDemand config) throws Descriptor.FormException, IOException { - return new EC2OndemandSlave(config.name, config.instanceId, config.description, config.remoteFS, config.numExecutors, config.labelString, config.mode, config.initScript, config.tmpDir, config.nodeProperties, config.remoteAdmin, config.jvmopts, config.stopOnTerminate, config.idleTerminationMinutes, config.publicDNS, config.privateDNS, config.tags, config.cloudName, config.useDedicatedTenancy, config.launchTimeout, config.amiType, config.connectionStrategy, config.maxTotalUses); + return new EC2OndemandSlave(config.name, config.instanceId, config.description, config.remoteFS, config.numExecutors, config.labelString, config.mode, config.initScript, config.tmpDir, config.nodeProperties, config.remoteAdmin, config.jvmopts, config.stopOnTerminate, config.idleTerminationMinutes, config.publicDNS, config.privateDNS, config.tags, config.cloudName, config.useDedicatedTenancy, config.useHostTenancy, config.launchTimeout, config.amiType, config.connectionStrategy, config.maxTotalUses); } @Override diff --git a/src/main/resources/hudson/plugins/ec2/EC2Computer/configure.jelly b/src/main/resources/hudson/plugins/ec2/EC2Computer/configure.jelly index df62a12ce..f2a2c416b 100644 --- a/src/main/resources/hudson/plugins/ec2/EC2Computer/configure.jelly +++ b/src/main/resources/hudson/plugins/ec2/EC2Computer/configure.jelly @@ -120,6 +120,10 @@ THE SOFTWARE. + + + + diff --git a/src/main/resources/hudson/plugins/ec2/SlaveTemplate/config.jelly b/src/main/resources/hudson/plugins/ec2/SlaveTemplate/config.jelly index bdcb6f64f..ddb291ea5 100644 --- a/src/main/resources/hudson/plugins/ec2/SlaveTemplate/config.jelly +++ b/src/main/resources/hudson/plugins/ec2/SlaveTemplate/config.jelly @@ -118,6 +118,10 @@ THE SOFTWARE. + + + + diff --git a/src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-useHostTenancy.html b/src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-useHostTenancy.html new file mode 100644 index 000000000..426b77289 --- /dev/null +++ b/src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-useHostTenancy.html @@ -0,0 +1,30 @@ + +
+ Create instance using dedicated hardware instead of shared. Additional charges will apply, please see + here: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html. +

+ This only applies for dedicated hosts which support host tenancy and this is an On-Demand + Instance (not Spot Instance). +

\ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java index 1ae4adaff..b534b97aa 100644 --- a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java @@ -21,7 +21,7 @@ public class EC2AbstractSlaveTest { @Test public void testGetLaunchTimeoutInMillisShouldNotOverflow() throws Exception { - EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, -1) { + EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "cloud", false,false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, -1) { @Override public void terminate() { // To change body of implemented methods use File | Settings | @@ -41,12 +41,12 @@ public String getEc2Type() { @Test public void testMaxUsesBackwardCompat() throws Exception { final String description = "description"; - SlaveTemplate orig = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1); + SlaveTemplate orig = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, null, "", true, false, false, false,"", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1); List templates = new ArrayList<>(); templates.add(orig); AmazonEC2Cloud ac = new AmazonEC2Cloud("us-east-1", false, "abc", "us-east-1", "ghi", "3", templates, null, null); r.jenkins.clouds.add(ac); - EC2AbstractSlave slave = new EC2AbstractSlave("name", "", description, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "ec2-us-east-1", false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, 0) { + EC2AbstractSlave slave = new EC2AbstractSlave("name", "", description, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "ec2-us-east-1", false, false,Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, 0) { @Override public void terminate() { } diff --git a/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java b/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java index e75aaf88c..52fe8de56 100644 --- a/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java @@ -16,10 +16,10 @@ public class EC2OndemandSlaveTest { @Test public void testSpecifyMode() throws Exception { - EC2OndemandSlave slaveNormal = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.NORMAL, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", false, 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1); + EC2OndemandSlave slaveNormal = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.NORMAL, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", false, false, 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1); assertEquals(Node.Mode.NORMAL, slaveNormal.getMode()); - EC2OndemandSlave slaveExclusive = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.EXCLUSIVE, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", false, 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1); + EC2OndemandSlave slaveExclusive = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.EXCLUSIVE, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", false,false, 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1); assertEquals(Node.Mode.EXCLUSIVE, slaveExclusive.getMode()); } diff --git a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java index 18aefd8a8..9faffb36a 100644 --- a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java @@ -68,7 +68,7 @@ public void testOnBillingHourRetention() throws Exception { } private EC2Computer computerWithIdleTime(final int minutes, final int seconds) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { + final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { @Override public void terminate() { } @@ -107,7 +107,7 @@ public InstanceState getState() { @Override public SlaveTemplate getSlaveTemplate() { - return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); + return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, false,"", false, ""); } }; assertTrue(computer.isIdle()); @@ -147,7 +147,7 @@ public void testOnUsageCountRetention() throws Exception { } private EC2Computer computerWithUsageLimit(final int usageLimit) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, usageLimit) { + final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false,false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, usageLimit) { @Override public void terminate() { terminateCalled.set(true); @@ -208,7 +208,7 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true,false, false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", Collections @@ -267,7 +267,7 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false,false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); @@ -323,7 +323,7 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false,false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); @@ -364,7 +364,7 @@ public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Excep public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidnight() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false,false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); @@ -419,7 +419,7 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni public void testRetentionStopsAfterActiveRangeEnds() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false,false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); diff --git a/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java b/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java index a8def2cc7..ec9c88f82 100644 --- a/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java @@ -29,7 +29,7 @@ public void init(){ @Test public void testMinimumNumberOfInstances() throws Exception { - SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0); + SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, false,false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", Collections.singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); @@ -45,7 +45,7 @@ public void testMinimumNumberOfSpareInstances() throws Exception { "tmpdir", "userdata", "10", "remoteadmin", null, "-Xmx1g", false, "subnet 456", null, "0", 0, 2, null, null, true, - true, false, "", false, + true, false,false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0, null); diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java index 8e3e55806..8b2a8cb25 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java @@ -98,7 +98,7 @@ public void testConfigRoundtrip() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, false,"", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -108,7 +108,31 @@ public void testConfigRoundtrip() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,useHostTenancy,connectionStrategy,hostKeyVerificationStrategy"); + } + + @Test + public void testConfigRoundtripWithHostTenancy() throws Exception { + String ami = "ami1"; + String description = "foo ami"; + + EC2Tag tag1 = new EC2Tag("name1", "value1"); + EC2Tag tag2 = new EC2Tag("name2", "value2"); + List tags = new ArrayList(); + tags.add(tag1); + tags.add(tag2); + + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, true,"", false, ""); + + List templates = new ArrayList(); + templates.add(orig); + + AmazonEC2Cloud ac = new AmazonEC2Cloud("us-east-1", false, "abc", "us-east-1", "ghi", "3", templates, null, null); + r.jenkins.clouds.add(ac); + + r.submit(r.createWebClient().goTo("configure").getFormByName("config")); + SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,useHostTenancy,connectionStrategy,hostKeyVerificationStrategy"); } @Test @@ -122,7 +146,7 @@ public void testConfigRoundtripWithCustomConnectionStrategy() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, null, "", true, false, false,false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1); List templates = new ArrayList(); templates.add(orig); @@ -132,7 +156,7 @@ public void testConfigRoundtripWithCustomConnectionStrategy() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,useHostTenancy,connectionStrategy,hostKeyVerificationStrategy"); } @Test @@ -142,7 +166,7 @@ public void testDefaultSSHHostKeyVerificationStrategy() throws Exception { List tags = new ArrayList(); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, false,"", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null); List templates = new ArrayList(); templates.add(orig); @@ -152,7 +176,7 @@ public void testDefaultSSHHostKeyVerificationStrategy() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,useHostTenancy,connectionStrategy,hostKeyVerificationStrategy"); // For already existing strategies, the default is this one assertEquals(HostKeyVerificationStrategyEnum.CHECK_NEW_SOFT, received.getHostKeyVerificationStrategy()); } @@ -171,7 +195,7 @@ public void testConfigRoundtripWithCustomSSHHostKeyVerificationStrategy() throws // We check this one is set final HostKeyVerificationStrategyEnum STRATEGY_TO_CHECK = HostKeyVerificationStrategyEnum.OFF; - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, STRATEGY_TO_CHECK); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, STRATEGY_TO_CHECK); List templates = new ArrayList(); templates.add(orig); @@ -181,7 +205,7 @@ public void testConfigRoundtripWithCustomSSHHostKeyVerificationStrategy() throws r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,useHostTenancy,connectionStrategy,hostKeyVerificationStrategy"); assertEquals(STRATEGY_TO_CHECK, received.getHostKeyVerificationStrategy()); } @@ -208,7 +232,7 @@ public void testConfigWithSpotBidPrice() throws Exception { spotConfig.setFallbackToOndemand(false); spotConfig.setSpotBlockReservationDuration(0); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, false,"", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -239,7 +263,7 @@ public void testSpotConfigWithoutBidPrice() throws Exception { SpotConfiguration spotConfig = new SpotConfiguration(false); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, false,"", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -273,7 +297,7 @@ public void testSpotConfigWithFallback() throws Exception { spotConfig.setFallbackToOndemand(true); spotConfig.setSpotBlockReservationDuration(0); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, false,"", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -301,7 +325,7 @@ public void testConfigRoundtripIamRole() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "iamInstanceProfile", false, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "iamInstanceProfile", false, false, false,"", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -316,13 +340,13 @@ public void testConfigRoundtripIamRole() throws Exception { @Test public void testNullTimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, false, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false,null, false, ""); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testUpdateAmi() { - SlaveTemplate st = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "0", false, ""); + SlaveTemplate st = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false,false, "0", false, ""); assertEquals("ami1", st.getAmi()); st.setAmi("ami2"); assertEquals("ami2", st.getAmi()); @@ -332,37 +356,37 @@ public void testUpdateAmi() { @Test public void test0TimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "0", false, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false,false, "0", false, ""); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testNegativeTimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "-1", false, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false,false, "-1", false, ""); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testNonNumericTimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "NotANumber", false, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false,"NotANumber", false, ""); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testAssociatePublicIpSetting() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, true, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false,null, true, ""); assertEquals(true, st.getAssociatePublicIp()); } @Test public void testConnectUsingPublicIpSetting() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false, null, true, "", false, true); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false, false,null, true, "", false, true); assertEquals(st.connectionStrategy, ConnectionStrategy.PUBLIC_IP); } @Test public void testConnectUsingPublicIpSettingWithDefaultSetting() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, true, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false,null, true, ""); assertEquals(st.connectionStrategy, ConnectionStrategy.PUBLIC_IP); } @@ -385,7 +409,7 @@ public void testWindowsConfigRoundTrip() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new WindowsData("password", false, ""), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new WindowsData("password", false, ""), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false,false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -411,7 +435,7 @@ public void testUnixConfigRoundTrip() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new UnixData("sudo", null, null, "22"), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new UnixData("sudo", null, null, "22"), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -426,7 +450,7 @@ public void testUnixConfigRoundTrip() throws Exception { @Test public void testChooseSubnetId() throws Exception { - SlaveTemplate slaveTemplate = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); + SlaveTemplate slaveTemplate = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, false,"", false, ""); String subnet1 = slaveTemplate.chooseSubnetId(); String subnet2 = slaveTemplate.chooseSubnetId(); @@ -440,7 +464,7 @@ public void testChooseSubnetId() throws Exception { @Issue("JENKINS-59460") @Test public void testConnectionStrategyDeprecatedFieldsAreExported() { - SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", Collections.singletonList(new EC2Tag("name1", "value1")), null, false, null, "", true, false, "", false, ""); + SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", Collections.singletonList(new EC2Tag("name1", "value1")), null, false, null, "", true, false, false,"", false, ""); String exported = Jenkins.XSTREAM.toXML(template); assertThat(exported, containsString("usePrivateDnsName")); @@ -465,7 +489,7 @@ public void testMinimumNumberOfInstancesActiveRangeConfig() throws Exception { spotConfig.setSpotMaxBidPrice("22"); spotConfig.setFallbackToOndemand(true); spotConfig.setSpotBlockReservationDuration(1); - SlaveTemplate slaveTemplate = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0); + SlaveTemplate slaveTemplate = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, false, false,"", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0); slaveTemplate.setMinimumNumberOfInstancesTimeRangeConfig(minimumNumberOfInstancesTimeRangeConfig); List templates = new ArrayList(); @@ -499,8 +523,8 @@ public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); - SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, false, false,"", associatePublicIp, ""); + SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, false, false,"", associatePublicIp, ""); List templates = new ArrayList(); templates.add(orig); @@ -542,8 +566,8 @@ public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Except tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); - SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, false, false,"", associatePublicIp, ""); + SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, false, false,"", associatePublicIp, ""); List templates = new ArrayList(); templates.add(orig); diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java index a3839035b..d92b4120d 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java @@ -52,7 +52,7 @@ public CreateTagsResult createTags(com.amazonaws.services.ec2.model.CreateTagsRe tags.add(tag2); String instanceId = "123"; - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, "") { + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true,false, false, "", false, "") { @Override protected Object readResolve() { return null; @@ -89,7 +89,7 @@ public CreateTagsResult createTags(com.amazonaws.services.ec2.model.CreateTagsRe tags.add(tag2); String instanceId = "123"; - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, "") { + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false,false, "", false, "") { @Override protected Object readResolve() { return null; diff --git a/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java b/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java index 8acd5eeaa..b35bc1257 100644 --- a/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java +++ b/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java @@ -56,7 +56,7 @@ private void setUpCloud(String label, Node.Mode mode) throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate template = new SlaveTemplate("ami", "foo", null, "default", "zone", InstanceType.M1Large, false, label, mode, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", true, "subnet 456", tags, null, false, null, "", false, false, null, false, ""); + SlaveTemplate template = new SlaveTemplate("ami", "foo", null, "default", "zone", InstanceType.M1Large, false, label, mode, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", true, "subnet 456", tags, null, false, null, "", false, false,false, null, false, ""); List templates = new ArrayList(); templates.add(template); diff --git a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java index c1dce8437..a0b510720 100644 --- a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java @@ -4,6 +4,7 @@ import com.amazonaws.services.ec2.model.InstanceType; import com.trilead.ssh2.Connection; import com.trilead.ssh2.ServerHostKeyVerifier; +import hudson.plugins.ec2.ssh.verifiers.Messages; import hudson.model.Node; import hudson.plugins.ec2.ConnectionStrategy; import hudson.plugins.ec2.EC2AbstractSlave; @@ -337,7 +338,7 @@ public MockEC2Computer(EC2AbstractSlave slave) { // Create a computer private static MockEC2Computer createComputer(String suffix) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave(COMPUTER_NAME + suffix, "id" + suffix, "description" + suffix, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { + final EC2AbstractSlave slave = new EC2AbstractSlave(COMPUTER_NAME + suffix, "id" + suffix, "description" + suffix, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, false,Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { @Override public void terminate() { } @@ -368,7 +369,7 @@ public EC2AbstractSlave getNode() { @Override public SlaveTemplate getSlaveTemplate() { - return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); + return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false,false, "", false, ""); } } diff --git a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java index cb2b1be96..1a0c58700 100644 --- a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java +++ b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java @@ -17,7 +17,7 @@ public class EC2AgentFactoryMockImpl implements EC2AgentFactory { @Override public EC2OndemandSlave createOnDemandAgent(EC2AgentConfig.OnDemand config) throws Descriptor.FormException, IOException { - return new MockEC2OndemandSlave(config.name, config.instanceId, config.description, config.remoteFS, config.numExecutors, config.labelString, config.mode, config.initScript, config.tmpDir, config.nodeProperties, config.remoteAdmin, config.jvmopts, config.stopOnTerminate, config.idleTerminationMinutes, config.publicDNS, config.privateDNS, config.tags, config.cloudName, config.useDedicatedTenancy, config.launchTimeout, config.amiType, config.connectionStrategy, config.maxTotalUses); + return new MockEC2OndemandSlave(config.name, config.instanceId, config.description, config.remoteFS, config.numExecutors, config.labelString, config.mode, config.initScript, config.tmpDir, config.nodeProperties, config.remoteAdmin, config.jvmopts, config.stopOnTerminate, config.idleTerminationMinutes, config.publicDNS, config.privateDNS, config.tags, config.cloudName, config.useDedicatedTenancy, config.useHostTenancy, config.launchTimeout, config.amiType, config.connectionStrategy, config.maxTotalUses); } @Override @@ -33,11 +33,11 @@ private MockEC2OndemandSlave(String name, String instanceId, String description, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, - List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, + List tags, String cloudName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) throws Descriptor.FormException, IOException { - super(name, instanceId, description, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, launchTimeout, amiType, connectionStrategy, maxTotalUses); + super(name, instanceId, description, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, connectionStrategy, maxTotalUses); } @Override diff --git a/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml b/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml index 9305771cc..e83f53ee2 100644 --- a/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml +++ b/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml @@ -34,4 +34,5 @@ type: T2Micro useDedicatedTenancy: false useEphemeralDevices: false + useHostTenancy: false useInstanceProfileForCredentials: true From af8422c31e79f3df0b92ed6fe879db7cfb632bcc Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Thu, 3 Sep 2020 01:37:18 +0530 Subject: [PATCH 02/26] Add Support for Host Tenancy Option --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5552ffc88..08f2abab3 100644 --- a/README.md +++ b/README.md @@ -322,7 +322,7 @@ def SlaveTemplateUsEast1Parameters = [ tmpDir: '', type: 't2.medium', useDedicatedTenancy: false, - useHostTenancy: false, + useHostTenancy: false, useEphemeralDevices: true, usePrivateDnsName: true, userData: '', From 0d6205d20f2750e4f32e78c9f3fb8eb4618e33f7 Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Thu, 3 Sep 2020 16:42:20 +0530 Subject: [PATCH 03/26] Add Support for Host Tenancy Option --- .../hudson/plugins/ec2/EC2AbstractSlave.java | 9 +- .../hudson/plugins/ec2/EC2OndemandSlave.java | 22 +-- .../java/hudson/plugins/ec2/EC2SpotSlave.java | 8 +- .../hudson/plugins/ec2/SlaveTemplate.java | 146 +++++------------- .../plugins/ec2/AmazonEC2CloudTest.java | 2 +- .../plugins/ec2/AmazonEC2CloudUnitTest.java | 24 +-- .../plugins/ec2/ConfigurationAsCodeTest.java | 2 +- .../plugins/ec2/EC2AbstractSlaveTest.java | 10 +- .../java/hudson/plugins/ec2/EC2CloudTest.java | 2 +- .../plugins/ec2/EC2OndemandSlaveTest.java | 4 +- .../plugins/ec2/EC2RetentionStrategyTest.java | 124 +++++++-------- .../plugins/ec2/EC2SlaveMonitorTest.java | 20 +-- .../hudson/plugins/ec2/SlaveTemplateTest.java | 88 +++++------ .../plugins/ec2/SlaveTemplateUnitTest.java | 6 +- .../plugins/ec2/TemplateLabelsTest.java | 4 +- .../SshHostKeyVerificationStrategyTest.java | 47 +++--- .../ec2/util/AmazonEC2FactoryMockImpl.java | 6 +- .../ec2/util/EC2AgentFactoryMockImpl.java | 18 +-- .../hudson/plugins/ec2/UnixDataExport.yml | 1 - 19 files changed, 231 insertions(+), 312 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java index 75d779ec5..b67b28644 100644 --- a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java @@ -93,7 +93,7 @@ public abstract class EC2AbstractSlave extends Slave { public final boolean stopOnTerminate; public final String idleTerminationMinutes; public final boolean useDedicatedTenancy; - public final boolean useHostTenancy; + public boolean useHostTenancy; public boolean isConnected = false; public List tags; public final String cloudName; @@ -141,7 +141,7 @@ public abstract class EC2AbstractSlave extends Slave { public static final String TEST_ZONE = "testZone"; - public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) + public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) throws FormException, IOException { super(name, remoteFS, launcher); @@ -162,7 +162,6 @@ public EC2AbstractSlave(String name, String instanceId, String templateDescripti this.tags = tags; this.usePrivateDnsName = connectionStrategy == ConnectionStrategy.PRIVATE_DNS; this.useDedicatedTenancy = useDedicatedTenancy; - this.useHostTenancy = useHostTenancy; this.cloudName = cloudName; this.launchTimeout = launchTimeout; this.amiType = amiType; @@ -172,9 +171,9 @@ public EC2AbstractSlave(String name, String instanceId, String templateDescripti } @Deprecated - public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType) + public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); + this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); } @Override diff --git a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java index c6d82aff8..58295720e 100644 --- a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java @@ -36,19 +36,19 @@ public class EC2OndemandSlave extends EC2AbstractSlave { @Deprecated public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, false, launchTimeout, amiType); + this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, launchTimeout, amiType); } @Deprecated - public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType) + public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType); + this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, useDedicatedTenancy, launchTimeout, amiType); } @Deprecated - public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType) + public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(templateDescription + " (" + instanceId + ")", instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, Collections.emptyList(), remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); + this(templateDescription + " (" + instanceId + ")", instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, Collections.emptyList(), remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, false, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); } @DataBoundConstructor @@ -56,17 +56,19 @@ public EC2OndemandSlave(String name, String instanceId, String templateDescripti throws FormException, IOException { super(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, amiType.isWindows() ? new EC2WindowsLauncher() - : new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, connectionStrategy, maxTotalUses); + : new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, launchTimeout, amiType, connectionStrategy, maxTotalUses); this.publicDNS = publicDNS; this.privateDNS = privateDNS; + this.useHostTenancy = useHostTenancy; } + /** * Constructor for debugging. */ public EC2OndemandSlave(String instanceId) throws FormException, IOException { - this(instanceId, instanceId, "debug", "/tmp/hudson", 1, "debug", Mode.NORMAL, "", "/tmp", Collections.emptyList(), null, null, false, null, "Fake public", "Fake private", null, null, false, false, 0, new UnixData(null, null, null, null), ConnectionStrategy.PRIVATE_IP, -1); + this(instanceId, instanceId, "debug", "/tmp/hudson", 1, "debug", Mode.NORMAL, "", "/tmp", Collections.emptyList(), null, null, false, null, "Fake public", "Fake private", null, null, false,false, 0, new UnixData(null, null, null, null), ConnectionStrategy.PRIVATE_IP, -1); } /** @@ -80,8 +82,8 @@ public void terminate() { try { if (!isAlive(true)) { /* - * The node has been killed externally, so we've nothing to do here - */ + * The node has been killed externally, so we've nothing to do here + */ LOGGER.info("EC2 instance already terminated: " + getInstanceId()); } else { AmazonEC2 ec2 = getCloud().connect(); @@ -138,4 +140,4 @@ public String getDisplayName() { public String getEc2Type() { return Messages.EC2OndemandSlave_OnDemand(); } -} +} \ No newline at end of file diff --git a/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java b/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java index 32d5492cc..1e786fdc7 100644 --- a/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java @@ -51,7 +51,7 @@ public EC2SpotSlave(String name, String spotInstanceRequestId, String templateDe throws FormException, IOException { super(name, "", templateDescription, remoteFS, numExecutors, mode, labelString, amiType.isWindows() ? new EC2WindowsLauncher() : - new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, false, idleTerminationMinutes, tags, cloudName, false, false,launchTimeout, amiType, connectionStrategy, maxTotalUses); + new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, false, idleTerminationMinutes, tags, cloudName, false, launchTimeout, amiType, connectionStrategy, maxTotalUses); this.name = name; this.spotInstanceRequestId = spotInstanceRequestId; @@ -90,8 +90,8 @@ public void terminate() { if (instanceId != null && !instanceId.equals("")) { if (!super.isAlive(true)) { /* - * The node has been killed externally, so we've nothing to do here - */ + * The node has been killed externally, so we've nothing to do here + */ LOGGER.info("EC2 instance already terminated: " + instanceId); } else { TerminateInstancesRequest request = new TerminateInstancesRequest(Collections.singletonList(instanceId)); @@ -223,4 +223,4 @@ public String getEc2ReadinessStatus() { } throw new AmazonClientException("No spot instance request"); } -} +} \ No newline at end of file diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index e841c0204..bdba89e73 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -23,20 +23,16 @@ import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.services.ec2.AmazonEC2; import com.amazonaws.services.ec2.model.AmazonEC2Exception; -import com.amazonaws.services.ec2.model.AvailabilityZone; import com.amazonaws.services.ec2.model.BlockDeviceMapping; import com.amazonaws.services.ec2.model.CancelSpotInstanceRequestsRequest; import com.amazonaws.services.ec2.model.CreateTagsRequest; import com.amazonaws.services.ec2.model.CreditSpecificationRequest; -import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult; import com.amazonaws.services.ec2.model.DescribeImagesRequest; import com.amazonaws.services.ec2.model.DescribeInstancesRequest; import com.amazonaws.services.ec2.model.DescribeInstancesResult; import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest; import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; import com.amazonaws.services.ec2.model.DescribeSpotInstanceRequestsRequest; -import com.amazonaws.services.ec2.model.DescribeSpotPriceHistoryRequest; -import com.amazonaws.services.ec2.model.DescribeSpotPriceHistoryResult; import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; import com.amazonaws.services.ec2.model.DescribeSubnetsResult; import com.amazonaws.services.ec2.model.Filter; @@ -61,7 +57,6 @@ import com.amazonaws.services.ec2.model.SpotInstanceRequest; import com.amazonaws.services.ec2.model.SpotMarketOptions; import com.amazonaws.services.ec2.model.SpotPlacement; -import com.amazonaws.services.ec2.model.SpotPrice; import com.amazonaws.services.ec2.model.StartInstancesRequest; import com.amazonaws.services.ec2.model.StartInstancesResult; import com.amazonaws.services.ec2.model.Subnet; @@ -126,92 +121,11 @@ import java.util.stream.Stream; import javax.annotation.CheckForNull; -import javax.servlet.ServletException; -import hudson.plugins.ec2.util.AmazonEC2Factory; -import hudson.plugins.ec2.util.DeviceMappingParser; -import hudson.plugins.ec2.util.EC2AgentConfig; -import hudson.plugins.ec2.util.EC2AgentFactory; -import hudson.plugins.ec2.util.MinimumInstanceChecker; -import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig; import edu.umd.cs.findbugs.annotations.NonNull; -import hudson.XmlFile; -import hudson.model.listeners.SaveableListener; import hudson.security.Permission; -import hudson.util.Secret; -import jenkins.model.Jenkins; -import jenkins.model.JenkinsLocationConfiguration; -import jenkins.slaves.iterators.api.NodeIterator; - -import org.apache.commons.lang.StringUtils; -import org.kohsuke.accmod.Restricted; -import org.kohsuke.accmod.restrictions.NoExternalUse; -import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.DataBoundSetter; -import org.kohsuke.stapler.QueryParameter; -import com.amazonaws.AmazonClientException; -import com.amazonaws.AmazonServiceException; -import com.amazonaws.auth.AWSCredentialsProvider; -import com.amazonaws.services.ec2.AmazonEC2; -import com.amazonaws.services.ec2.model.AmazonEC2Exception; -import com.amazonaws.services.ec2.model.BlockDeviceMapping; -import com.amazonaws.services.ec2.model.CancelSpotInstanceRequestsRequest; -import com.amazonaws.services.ec2.model.CreateTagsRequest; -import com.amazonaws.services.ec2.model.CreditSpecificationRequest; -import com.amazonaws.services.ec2.model.DescribeImagesRequest; -import com.amazonaws.services.ec2.model.DescribeInstancesRequest; -import com.amazonaws.services.ec2.model.DescribeInstancesResult; -import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest; -import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; -import com.amazonaws.services.ec2.model.DescribeSpotInstanceRequestsRequest; -import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; -import com.amazonaws.services.ec2.model.DescribeSubnetsResult; -import com.amazonaws.services.ec2.model.Filter; -import com.amazonaws.services.ec2.model.IamInstanceProfileSpecification; -import com.amazonaws.services.ec2.model.Image; -import com.amazonaws.services.ec2.model.Instance; -import com.amazonaws.services.ec2.model.InstanceMarketOptionsRequest; -import com.amazonaws.services.ec2.model.InstanceNetworkInterfaceSpecification; -import com.amazonaws.services.ec2.model.InstanceStateName; -import com.amazonaws.services.ec2.model.InstanceType; -import com.amazonaws.services.ec2.model.KeyPair; -import com.amazonaws.services.ec2.model.LaunchSpecification; -import com.amazonaws.services.ec2.model.MarketType; -import com.amazonaws.services.ec2.model.Placement; -import com.amazonaws.services.ec2.model.RequestSpotInstancesRequest; -import com.amazonaws.services.ec2.model.RequestSpotInstancesResult; -import com.amazonaws.services.ec2.model.Reservation; -import com.amazonaws.services.ec2.model.ResourceType; -import com.amazonaws.services.ec2.model.RunInstancesRequest; -import com.amazonaws.services.ec2.model.SecurityGroup; -import com.amazonaws.services.ec2.model.ShutdownBehavior; -import com.amazonaws.services.ec2.model.SpotInstanceRequest; -import com.amazonaws.services.ec2.model.SpotMarketOptions; -import com.amazonaws.services.ec2.model.SpotPlacement; -import com.amazonaws.services.ec2.model.StartInstancesRequest; -import com.amazonaws.services.ec2.model.StartInstancesResult; -import com.amazonaws.services.ec2.model.Subnet; -import com.amazonaws.services.ec2.model.Tag; -import com.amazonaws.services.ec2.model.TagSpecification; - -import hudson.Extension; -import hudson.Util; -import hudson.model.Describable; -import hudson.model.Descriptor; -import hudson.model.Descriptor.FormException; -import hudson.model.Hudson; -import hudson.model.Label; -import hudson.model.Node; -import hudson.model.Saveable; -import hudson.model.TaskListener; -import hudson.model.labels.LabelAtom; -import hudson.slaves.NodeProperty; -import hudson.slaves.NodePropertyDescriptor; -import hudson.util.DescribableList; -import hudson.util.FormValidation; -import hudson.util.ListBoxModel; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -293,7 +207,7 @@ public class SlaveTemplate implements Describable { public final boolean useDedicatedTenancy; - public final boolean useHostTenancy; + private boolean useHostTenancy; public AMITypeData amiType; @@ -340,7 +254,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, List> nodeProperties, HostKeyVerificationStrategyEnum hostKeyVerificationStrategy) { @@ -376,7 +290,6 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri this.associatePublicIp = associatePublicIp; this.connectionStrategy = connectionStrategy == null ? ConnectionStrategy.PRIVATE_IP : connectionStrategy; this.useDedicatedTenancy = useDedicatedTenancy; - this.useHostTenancy = useHostTenancy; this.connectBySSHProcess = connectBySSHProcess; this.maxTotalUses = maxTotalUses; this.nodeProperties = new DescribableList<>(Saveable.NOOP, Util.fixNull(nodeProperties)); @@ -418,7 +331,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, List> nodeProperties) { @@ -427,7 +340,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, minimumNumberOfSpareInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, + useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, nodeProperties, null); @@ -439,13 +352,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses,List> nodeProperties ) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, + useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, nodeProperties); } @@ -455,13 +368,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, + useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, Collections.emptyList()); } @@ -471,13 +384,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses); } @@ -487,13 +400,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, boolean monitoring, boolean t2Unlimited) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, connectUsingPublicIp, associatePublicIp), -1); } @@ -502,12 +415,12 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, connectUsingPublicIp, false, false); } @@ -516,12 +429,12 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, + boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, false, useEphemeralDevices, - useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, false); + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, false); } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, @@ -529,22 +442,35 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { + boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, useEphemeralDevices, - useDedicatedTenancy, useHostTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, false); + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, false); + } + + public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { + this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, + tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, + idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, useEphemeralDevices, + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, false); + this.useHostTenancy = useHostTenancy; } /** * Backward compatible constructor for reloading previous version data */ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, - String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, - String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - String launchTimeoutStr) { + String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, + String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, + String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + String launchTimeoutStr) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, new UnixData(rootCommandPrefix, slaveCommandPrefix, slaveCommandSuffix, sshPort), jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, diff --git a/src/test/java/hudson/plugins/ec2/AmazonEC2CloudTest.java b/src/test/java/hudson/plugins/ec2/AmazonEC2CloudTest.java index 6e962ae20..49ab7decb 100644 --- a/src/test/java/hudson/plugins/ec2/AmazonEC2CloudTest.java +++ b/src/test/java/hudson/plugins/ec2/AmazonEC2CloudTest.java @@ -93,4 +93,4 @@ private HtmlForm getConfigForm() throws IOException, SAXException { } } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/AmazonEC2CloudUnitTest.java b/src/test/java/hudson/plugins/ec2/AmazonEC2CloudUnitTest.java index 06cf53481..74b1648d9 100644 --- a/src/test/java/hudson/plugins/ec2/AmazonEC2CloudUnitTest.java +++ b/src/test/java/hudson/plugins/ec2/AmazonEC2CloudUnitTest.java @@ -54,8 +54,8 @@ /** -* Unit tests related to {@link AmazonEC2Cloud}, but do not require a Jenkins instance. -*/ + * Unit tests related to {@link AmazonEC2Cloud}, but do not require a Jenkins instance. + */ @PowerMockIgnore({"javax.crypto.*", "org.hamcrest.*", "javax.net.ssl.*", "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*"}) @RunWith(PowerMockRunner.class) @PrepareForTest({EC2Cloud.class, Jenkins.class}) @@ -73,16 +73,16 @@ public void testEC2EndpointURLCreation() throws MalformedURLException { @Test public void testInstaceCap() throws Exception { AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", - null, "key", null, Collections.emptyList(), - "roleArn", "roleSessionName"); + null, "key", null, Collections.emptyList(), + "roleArn", "roleSessionName"); assertEquals(cloud.getInstanceCap(), Integer.MAX_VALUE); assertEquals(cloud.getInstanceCapStr(), ""); final int cap = 3; final String capStr = String.valueOf(cap); cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", - null, "key", capStr, Collections.emptyList(), - "roleArn", "roleSessionName"); + null, "key", capStr, Collections.emptyList(), + "roleArn", "roleSessionName"); assertEquals(cloud.getInstanceCap(), cap); assertEquals(cloud.getInstanceCapStr(), capStr); } @@ -91,8 +91,8 @@ public void testInstaceCap() throws Exception { public void testSpotInstanceCount() throws Exception { final int numberOfSpotInstanceRequests = 105; AmazonEC2Cloud cloud = PowerMockito.spy(new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", - null, "key", null, Collections.emptyList(), - "roleArn", "roleSessionName")); + null, "key", null, Collections.emptyList(), + "roleArn", "roleSessionName")); PowerMockito.mockStatic(Jenkins.class); Jenkins jenkinsMock = mock(Jenkins.class); EC2SpotSlave spotSlaveMock = mock(EC2SpotSlave.class); @@ -106,15 +106,15 @@ public void testSpotInstanceCount() throws Exception { for(int i=0; i<=numberOfSpotInstanceRequests; i++) { instances.add(new Instance().withInstanceId("id"+i).withTags(new Tag().withKey("jenkins_slave_type").withValue("spot"))); } - + AmazonEC2FactoryMockImpl.instances = instances; - + Mockito.doReturn(AmazonEC2FactoryMockImpl.createAmazonEC2Mock(null)).when(cloud).connect(); Object[] params = {null, "jenkinsurl", new HashSet()}; int n = Whitebox.invokeMethod(cloud, "countCurrentEC2SpotSlaves", params); - + // Should equal number of spot instance requests + 1 for spot nodes not having a spot instance request assertEquals(numberOfSpotInstanceRequests+1, n); } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java b/src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java index ac9c83543..12a411112 100644 --- a/src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java +++ b/src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java @@ -145,4 +145,4 @@ public void testConfigAsCodeExport() throws Exception { String expected = toStringFromYamlFile(this, "UnixDataExport.yml"); assertEquals(expected, exported); } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java index b534b97aa..4f5999136 100644 --- a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java @@ -21,7 +21,7 @@ public class EC2AbstractSlaveTest { @Test public void testGetLaunchTimeoutInMillisShouldNotOverflow() throws Exception { - EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "cloud", false,false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, -1) { + EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, -1) { @Override public void terminate() { // To change body of implemented methods use File | Settings | @@ -31,7 +31,7 @@ public void terminate() { @Override public String getEc2Type() { return null; // To change body of implemented methods use File | - // Settings | File Templates. + // Settings | File Templates. } }; @@ -41,12 +41,12 @@ public String getEc2Type() { @Test public void testMaxUsesBackwardCompat() throws Exception { final String description = "description"; - SlaveTemplate orig = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, null, "", true, false, false, false,"", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1); + SlaveTemplate orig = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1); List templates = new ArrayList<>(); templates.add(orig); AmazonEC2Cloud ac = new AmazonEC2Cloud("us-east-1", false, "abc", "us-east-1", "ghi", "3", templates, null, null); r.jenkins.clouds.add(ac); - EC2AbstractSlave slave = new EC2AbstractSlave("name", "", description, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "ec2-us-east-1", false, false,Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, 0) { + EC2AbstractSlave slave = new EC2AbstractSlave("name", "", description, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "ec2-us-east-1", false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, 0) { @Override public void terminate() { } @@ -58,4 +58,4 @@ public String getEc2Type() { }; assertEquals(-1, slave.maxTotalUses); } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/EC2CloudTest.java b/src/test/java/hudson/plugins/ec2/EC2CloudTest.java index 40ac36588..67deab30f 100644 --- a/src/test/java/hudson/plugins/ec2/EC2CloudTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2CloudTest.java @@ -76,4 +76,4 @@ public Void answer(InvocationOnMock invocation) { Node[] expectedNodes = {mockOrphanNode}; assertArrayEquals(expectedNodes, listOfJenkinsNodes.toArray()); } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java b/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java index 52fe8de56..fef4762d0 100644 --- a/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java @@ -19,8 +19,8 @@ public void testSpecifyMode() throws Exception { EC2OndemandSlave slaveNormal = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.NORMAL, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", false, false, 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1); assertEquals(Node.Mode.NORMAL, slaveNormal.getMode()); - EC2OndemandSlave slaveExclusive = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.EXCLUSIVE, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", false,false, 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1); + EC2OndemandSlave slaveExclusive = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.EXCLUSIVE, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", false, false, 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1); assertEquals(Node.Mode.EXCLUSIVE, slaveExclusive.getMode()); } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java index 9faffb36a..5f45f6331 100644 --- a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java @@ -68,7 +68,7 @@ public void testOnBillingHourRetention() throws Exception { } private EC2Computer computerWithIdleTime(final int minutes, final int seconds) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { + final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { @Override public void terminate() { } @@ -107,7 +107,7 @@ public InstanceState getState() { @Override public SlaveTemplate getSlaveTemplate() { - return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, false,"", false, ""); + return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); } }; assertTrue(computer.isIdle()); @@ -147,7 +147,7 @@ public void testOnUsageCountRetention() throws Exception { } private EC2Computer computerWithUsageLimit(final int usageLimit) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false,false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, usageLimit) { + final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, usageLimit) { @Override public void terminate() { terminateCalled.set(true); @@ -207,19 +207,19 @@ public void testInternalCheckRespectsWait() throws Exception { public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true,false, false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -230,9 +230,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check too assertEquals(2, computers.size()); @@ -242,9 +242,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { cloud.provision(template, 1); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have three slaves before any checking assertEquals(3, computers.size()); @@ -254,9 +254,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check assertEquals(2, computers.size()); @@ -266,9 +266,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { @Test public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false,false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -290,15 +290,15 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -309,9 +309,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check too assertEquals(2, computers.size()); @@ -322,9 +322,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws @Test public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false,false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -346,15 +346,15 @@ public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Excep MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have zero slaves assertEquals(0, computers.size()); @@ -363,9 +363,9 @@ public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Excep @Test public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidnight() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false,false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("15:00"); @@ -387,15 +387,15 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -406,9 +406,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check too assertEquals(2, computers.size()); @@ -418,9 +418,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni @Test public void testRetentionStopsAfterActiveRangeEnds() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false,false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -441,15 +441,15 @@ public void testRetentionStopsAfterActiveRangeEnds() throws Exception { MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -464,9 +464,9 @@ public void testRetentionStopsAfterActiveRangeEnds() throws Exception { checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have 1 slaves after check assertEquals(1, computers.size()); @@ -478,4 +478,4 @@ private static void checkRetentionStrategy(EC2RetentionStrategy rs, EC2Computer EC2AbstractSlave node = c.getNode(); assertTrue(node.terminateScheduled.await(10, TimeUnit.SECONDS)); } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java b/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java index ec9c88f82..64bbe97d4 100644 --- a/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java @@ -29,7 +29,7 @@ public void init(){ @Test public void testMinimumNumberOfInstances() throws Exception { - SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, false,false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0); + SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", Collections.singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); @@ -41,17 +41,17 @@ public void testMinimumNumberOfInstances() throws Exception { public void testMinimumNumberOfSpareInstances() throws Exception { // Arguments split onto newlines matching the construtor definition to make figuring which is which easier. SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "defaultsecgroup", "remotefs", - InstanceType.M1Large, false, "label", Node.Mode.NORMAL, "description", "init script", - "tmpdir", "userdata", "10", "remoteadmin", null, "-Xmx1g", - false, "subnet 456", null, "0", 0, - 2, null, null, true, - true, false,false, "", false, - "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, - null); + InstanceType.M1Large, false, "label", Node.Mode.NORMAL, "description", "init script", + "tmpdir", "userdata", "10", "remoteadmin", null, "-Xmx1g", + false, "subnet 456", null, "0", 0, + 2, null, null, true, + true, false, "", false, + "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, + null); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", Collections.singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); Assert.assertEquals(2, Arrays.stream(Jenkins.get().getComputers()).filter(computer -> computer instanceof EC2Computer).count()); } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java index 8b2a8cb25..aba9d09e5 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java @@ -49,22 +49,16 @@ import hudson.plugins.ec2.SlaveTemplate.ProvisionOptions; import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig; import com.amazonaws.services.ec2.model.Reservation; -import hudson.plugins.ec2.util.PrivateKeyHelper; import jenkins.model.Jenkins; import net.sf.json.JSONObject; -import org.apache.commons.math3.analysis.function.Power; import org.junit.Assert; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.runner.RunWith; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.mockito.ArgumentCaptor; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.modules.junit4.PowerMockRunner; import java.util.ArrayList; import java.util.Collections; @@ -98,7 +92,7 @@ public void testConfigRoundtrip() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, false,"", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -108,7 +102,7 @@ public void testConfigRoundtrip() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,useHostTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); } @Test @@ -122,7 +116,7 @@ public void testConfigRoundtripWithHostTenancy() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, true,"", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false,true, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -132,7 +126,7 @@ public void testConfigRoundtripWithHostTenancy() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,useHostTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); } @Test @@ -146,7 +140,7 @@ public void testConfigRoundtripWithCustomConnectionStrategy() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, null, "", true, false, false,false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1); List templates = new ArrayList(); templates.add(orig); @@ -156,7 +150,7 @@ public void testConfigRoundtripWithCustomConnectionStrategy() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,useHostTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); } @Test @@ -166,7 +160,7 @@ public void testDefaultSSHHostKeyVerificationStrategy() throws Exception { List tags = new ArrayList(); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, false,"", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null); List templates = new ArrayList(); templates.add(orig); @@ -176,7 +170,7 @@ public void testDefaultSSHHostKeyVerificationStrategy() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,useHostTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); // For already existing strategies, the default is this one assertEquals(HostKeyVerificationStrategyEnum.CHECK_NEW_SOFT, received.getHostKeyVerificationStrategy()); } @@ -194,8 +188,8 @@ public void testConfigRoundtripWithCustomSSHHostKeyVerificationStrategy() throws // We check this one is set final HostKeyVerificationStrategyEnum STRATEGY_TO_CHECK = HostKeyVerificationStrategyEnum.OFF; - - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, STRATEGY_TO_CHECK); + + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, STRATEGY_TO_CHECK); List templates = new ArrayList(); templates.add(orig); @@ -205,7 +199,7 @@ public void testConfigRoundtripWithCustomSSHHostKeyVerificationStrategy() throws r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,useHostTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); assertEquals(STRATEGY_TO_CHECK, received.getHostKeyVerificationStrategy()); } @@ -232,7 +226,7 @@ public void testConfigWithSpotBidPrice() throws Exception { spotConfig.setFallbackToOndemand(false); spotConfig.setSpotBlockReservationDuration(0); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, false,"", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -263,7 +257,7 @@ public void testSpotConfigWithoutBidPrice() throws Exception { SpotConfiguration spotConfig = new SpotConfiguration(false); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, false,"", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -297,7 +291,7 @@ public void testSpotConfigWithFallback() throws Exception { spotConfig.setFallbackToOndemand(true); spotConfig.setSpotBlockReservationDuration(0); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, false,"", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -325,7 +319,7 @@ public void testConfigRoundtripIamRole() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "iamInstanceProfile", false, false, false,"", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "iamInstanceProfile", false, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -340,13 +334,13 @@ public void testConfigRoundtripIamRole() throws Exception { @Test public void testNullTimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false,null, false, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, false, ""); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testUpdateAmi() { - SlaveTemplate st = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false,false, "0", false, ""); + SlaveTemplate st = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "0", false, ""); assertEquals("ami1", st.getAmi()); st.setAmi("ami2"); assertEquals("ami2", st.getAmi()); @@ -356,37 +350,37 @@ public void testUpdateAmi() { @Test public void test0TimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false,false, "0", false, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "0", false, ""); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testNegativeTimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false,false, "-1", false, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "-1", false, ""); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testNonNumericTimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false,"NotANumber", false, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "NotANumber", false, ""); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testAssociatePublicIpSetting() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false,null, true, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, true, ""); assertEquals(true, st.getAssociatePublicIp()); } @Test public void testConnectUsingPublicIpSetting() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false, false,null, true, "", false, true); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false, null, true, "", false, true); assertEquals(st.connectionStrategy, ConnectionStrategy.PUBLIC_IP); } @Test public void testConnectUsingPublicIpSettingWithDefaultSetting() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false,null, true, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, true, ""); assertEquals(st.connectionStrategy, ConnectionStrategy.PUBLIC_IP); } @@ -409,7 +403,7 @@ public void testWindowsConfigRoundTrip() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new WindowsData("password", false, ""), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false,false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new WindowsData("password", false, ""), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -435,7 +429,7 @@ public void testUnixConfigRoundTrip() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new UnixData("sudo", null, null, "22"), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new UnixData("sudo", null, null, "22"), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -450,7 +444,7 @@ public void testUnixConfigRoundTrip() throws Exception { @Test public void testChooseSubnetId() throws Exception { - SlaveTemplate slaveTemplate = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, false,"", false, ""); + SlaveTemplate slaveTemplate = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); String subnet1 = slaveTemplate.chooseSubnetId(); String subnet2 = slaveTemplate.chooseSubnetId(); @@ -464,7 +458,7 @@ public void testChooseSubnetId() throws Exception { @Issue("JENKINS-59460") @Test public void testConnectionStrategyDeprecatedFieldsAreExported() { - SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", Collections.singletonList(new EC2Tag("name1", "value1")), null, false, null, "", true, false, false,"", false, ""); + SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", Collections.singletonList(new EC2Tag("name1", "value1")), null, false, null, "", true, false, "", false, ""); String exported = Jenkins.XSTREAM.toXML(template); assertThat(exported, containsString("usePrivateDnsName")); @@ -489,7 +483,7 @@ public void testMinimumNumberOfInstancesActiveRangeConfig() throws Exception { spotConfig.setSpotMaxBidPrice("22"); spotConfig.setFallbackToOndemand(true); spotConfig.setSpotBlockReservationDuration(1); - SlaveTemplate slaveTemplate = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, false, false,"", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0); + SlaveTemplate slaveTemplate = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0); slaveTemplate.setMinimumNumberOfInstancesTimeRangeConfig(minimumNumberOfInstancesTimeRangeConfig); List templates = new ArrayList(); @@ -508,8 +502,8 @@ public void testMinimumNumberOfInstancesActiveRangeConfig() throws Exception { Assert.assertEquals(true, stored.getMinimumNoInstancesActiveTimeRangeDays().get("tuesday")); } - @Test - public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { + @Test + public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { boolean associatePublicIp = false; String ami = "ami1"; String description = "foo ami"; @@ -523,8 +517,8 @@ public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, false, false,"", associatePublicIp, ""); - SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, false, false,"", associatePublicIp, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); + SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); List templates = new ArrayList(); templates.add(orig); @@ -549,10 +543,10 @@ public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { assertEquals(actualRequest.getSecurityGroups(), Stream.of(securityGroups).collect(Collectors.toList())); } } - } + } - @Test - public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Exception { + @Test + public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Exception { boolean associatePublicIp = true; String ami = "ami1"; String description = "foo ami"; @@ -566,8 +560,8 @@ public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Except tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, false, false,"", associatePublicIp, ""); - SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, false, false,"", associatePublicIp, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); + SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); List templates = new ArrayList(); templates.add(orig); @@ -589,9 +583,9 @@ public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Except assertEquals(actualRequest.getSecurityGroupIds(), Collections.emptyList()); assertEquals(actualRequest.getSecurityGroups(), Collections.emptyList()); } - } + } - private AmazonEC2 setupTestForProvisioning(SlaveTemplate template) throws Exception { + private AmazonEC2 setupTestForProvisioning(SlaveTemplate template) throws Exception { AmazonEC2Cloud mockedCloud = mock(AmazonEC2Cloud.class); AmazonEC2 mockedEC2 = mock(AmazonEC2.class); EC2PrivateKey mockedPrivateKey = mock(EC2PrivateKey.class); @@ -643,5 +637,5 @@ private AmazonEC2 setupTestForProvisioning(SlaveTemplate template) throws Except when(mockedEC2.runInstances(any(RunInstancesRequest.class))).thenReturn(mockedResult); return mockedEC2; - } -} + } +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java index d92b4120d..07d5d8f29 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java @@ -52,7 +52,7 @@ public CreateTagsResult createTags(com.amazonaws.services.ec2.model.CreateTagsRe tags.add(tag2); String instanceId = "123"; - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true,false, false, "", false, "") { + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, "") { @Override protected Object readResolve() { return null; @@ -89,7 +89,7 @@ public CreateTagsResult createTags(com.amazonaws.services.ec2.model.CreateTagsRe tags.add(tag2); String instanceId = "123"; - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false,false, "", false, "") { + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, "") { @Override protected Object readResolve() { return null; @@ -131,4 +131,4 @@ public void publish(LogRecord record) { public List getRecords() { return records; } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java b/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java index b35bc1257..64df1b4a5 100644 --- a/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java +++ b/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java @@ -56,7 +56,7 @@ private void setUpCloud(String label, Node.Mode mode) throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate template = new SlaveTemplate("ami", "foo", null, "default", "zone", InstanceType.M1Large, false, label, mode, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", true, "subnet 456", tags, null, false, null, "", false, false,false, null, false, ""); + SlaveTemplate template = new SlaveTemplate("ami", "foo", null, "default", "zone", InstanceType.M1Large, false, label, mode, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", true, "subnet 456", tags, null, false, null, "", false, false, null, false, ""); List templates = new ArrayList(); templates.add(template); @@ -109,4 +109,4 @@ public void testExclusiveModeEmptyLabel() throws Exception { assertEquals(false, ac.canProvision(null)); } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java index a0b510720..de2cd0c7f 100644 --- a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java @@ -4,7 +4,6 @@ import com.amazonaws.services.ec2.model.InstanceType; import com.trilead.ssh2.Connection; import com.trilead.ssh2.ServerHostKeyVerifier; -import hudson.plugins.ec2.ssh.verifiers.Messages; import hudson.model.Node; import hudson.plugins.ec2.ConnectionStrategy; import hudson.plugins.ec2.EC2AbstractSlave; @@ -31,14 +30,14 @@ public class SshHostKeyVerificationStrategyTest { private static final String COMPUTER_NAME = "MockInstanceForTest"; - + @ClassRule public static ConnectionRule conRule = new ConnectionRule(); - + @ClassRule public static LoggerRule loggerRule; - - @ClassRule + + @ClassRule public static JenkinsRule jenkins = new JenkinsRule(); /** @@ -55,7 +54,7 @@ public void verifyAllStrategiesTest() throws Exception { } // Return a list with all the strategies to check. Each element represents the strategy to check with the connection - // to the host and the assertion of the expected result on the console and the offline status of the instance. + // to the host and the assertion of the expected result on the console and the offline status of the instance. private List getStrategiesToTest() throws Exception { List strategiesToCheck = new ArrayList<>(); @@ -123,7 +122,7 @@ private StrategyTest forHardStrategyPrintedAndChanged() throws Exception { .addConnectionAttempt(builder().setConsole("A text before the key\n" + conRule.ED255219_PUB_KEY + "\n a bit more text") .setMessagesInLog(new String[]{ "has been successfully checked against the instance console"})) - + .addConnectionAttempt(builder().setConsole("The console doesn't matter, the key is already stored. We check against this one") .isOfflineByKey(true) .isChangeHostKey(true) @@ -184,7 +183,7 @@ private StrategyTest forOffStrategy() throws Exception { private ConnectionAttempt.Builder builder() { return new ConnectionAttempt.Builder(); } - + /** * A class to test a strategy. It stores the computer to connect to, the different configurations the computer is * passing through and the verifier used to connect to that computer. @@ -193,18 +192,18 @@ private static class StrategyTest { List connectionAttempts = new ArrayList<>(); MockEC2Computer computer; ServerHostKeyVerifierImpl verifier; - + public void check() throws Exception { for (ConnectionAttempt connectionAttempt : connectionAttempts) { connectionAttempt.attempt(); } } - + private StrategyTest(String computerSuffix, SshHostKeyVerificationStrategy strategy) throws Exception { computer = MockEC2Computer.createComputer(computerSuffix); verifier = new ServerHostKeyVerifierImpl(computer, strategy); } - + private StrategyTest addConnectionAttempt(ConnectionAttempt.Builder computerStateBuilder) { // The computer and verifier are the same for every computerState of the strategy. We set them here connectionAttempts.add(computerStateBuilder.build(computer, verifier, connectionAttempts.size() + 1)); @@ -223,12 +222,12 @@ private static class ConnectionAttempt { private InstanceState state = InstanceState.RUNNING; // Whether the real host key of the computer is changed before this step private boolean changeHostKey = false; - - // The expected messages the computer has printed out on the logs + + // The expected messages the computer has printed out on the logs private String[] messagesInLog = new String[]{}; // Whether the computer is set offline because a problem with the host key (it could be offline at the beginning) private boolean isOfflineByKey = false; - + // The computer and verifier used during the try of connection private MockEC2Computer computer; private ServerHostKeyVerifierImpl verifier; @@ -284,13 +283,13 @@ private void assertState() { assertThat(String.format("Stage %d. Log message not found on %s using %s strategy", stage, computer.getName(), verifier.strategy.getClass().getSimpleName()), loggerRule, LoggerRule.recorded(StringContains.containsString(messageInLog))); } } - + /** * A builder to build the attempt easily */ static class Builder { ConnectionAttempt connectionAttempt; - + Builder setConsole(String console) { connectionAttempt.console = console; return this; @@ -299,7 +298,7 @@ Builder setState(InstanceState state) { connectionAttempt.state = state; return this; } - Builder setMessagesInLog(String[] messagesInLog) { + Builder setMessagesInLog(String[] messagesInLog) { connectionAttempt.messagesInLog = messagesInLog; return this; } @@ -315,7 +314,7 @@ Builder isChangeHostKey(boolean changeHostKey) { Builder() { connectionAttempt = new ConnectionAttempt(); } - + private ConnectionAttempt build(MockEC2Computer computer, ServerHostKeyVerifierImpl verifier, int stage) { connectionAttempt.stage = stage; connectionAttempt.computer = computer; @@ -330,7 +329,7 @@ private static class MockEC2Computer extends EC2Computer { InstanceState state = InstanceState.PENDING; String console = null; EC2AbstractSlave slave; - + public MockEC2Computer(EC2AbstractSlave slave) { super(slave); this.slave = slave; @@ -338,7 +337,7 @@ public MockEC2Computer(EC2AbstractSlave slave) { // Create a computer private static MockEC2Computer createComputer(String suffix) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave(COMPUTER_NAME + suffix, "id" + suffix, "description" + suffix, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, false,Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { + final EC2AbstractSlave slave = new EC2AbstractSlave(COMPUTER_NAME + suffix, "id" + suffix, "description" + suffix, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { @Override public void terminate() { } @@ -369,10 +368,10 @@ public EC2AbstractSlave getNode() { @Override public SlaveTemplate getSlaveTemplate() { - return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false,false, "", false, ""); + return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); } - } - + } + // A verifier using the set strategy private static class ServerHostKeyVerifierImpl implements ServerHostKeyVerifier { private final EC2Computer computer; @@ -389,4 +388,4 @@ public boolean verifyServerHostKey(String hostname, int port, String serverHostK return strategy.verify(computer, new HostKey(serverHostKeyAlgorithm, serverHostKey), null); } } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/util/AmazonEC2FactoryMockImpl.java b/src/test/java/hudson/plugins/ec2/util/AmazonEC2FactoryMockImpl.java index 6d033b3f6..ae6cb68d0 100644 --- a/src/test/java/hudson/plugins/ec2/util/AmazonEC2FactoryMockImpl.java +++ b/src/test/java/hudson/plugins/ec2/util/AmazonEC2FactoryMockImpl.java @@ -41,7 +41,7 @@ public class AmazonEC2FactoryMockImpl implements AmazonEC2Factory { */ public static AmazonEC2Client createAmazonEC2Mock() { instances = new ArrayList<>(); // Reset for each new mock. In the real world, the client is stateless, but this - // is convenient for testing. + // is convenient for testing. return createAmazonEC2Mock(null); } @@ -79,7 +79,7 @@ private static void mockDescribeRegions(AmazonEC2Client mock) { private static void mockDescribeInstances(AmazonEC2Client mock) { Mockito.doCallRealMethod().when(mock).describeInstances(); // This will just pass on to - // describeInstances(describeInstancesRequest) + // describeInstances(describeInstancesRequest) Mockito.doAnswer(invocationOnMock -> { DescribeInstancesRequest request = invocationOnMock.getArgument(0); if (request.getInstanceIds() != null && !request.getInstanceIds().isEmpty()) { @@ -182,4 +182,4 @@ public AmazonEC2 connect(AWSCredentialsProvider credentialsProvider, URL ec2Endp } return mock; } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java index 1a0c58700..545995f80 100644 --- a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java +++ b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java @@ -17,7 +17,7 @@ public class EC2AgentFactoryMockImpl implements EC2AgentFactory { @Override public EC2OndemandSlave createOnDemandAgent(EC2AgentConfig.OnDemand config) throws Descriptor.FormException, IOException { - return new MockEC2OndemandSlave(config.name, config.instanceId, config.description, config.remoteFS, config.numExecutors, config.labelString, config.mode, config.initScript, config.tmpDir, config.nodeProperties, config.remoteAdmin, config.jvmopts, config.stopOnTerminate, config.idleTerminationMinutes, config.publicDNS, config.privateDNS, config.tags, config.cloudName, config.useDedicatedTenancy, config.useHostTenancy, config.launchTimeout, config.amiType, config.connectionStrategy, config.maxTotalUses); + return new MockEC2OndemandSlave(config.name, config.instanceId, config.description, config.remoteFS, config.numExecutors, config.labelString, config.mode, config.initScript, config.tmpDir, config.nodeProperties, config.remoteAdmin, config.jvmopts, config.stopOnTerminate, config.idleTerminationMinutes, config.publicDNS, config.privateDNS, config.tags, config.cloudName, config.useDedicatedTenancy, config.launchTimeout, config.amiType, config.connectionStrategy, config.maxTotalUses); } @Override @@ -30,14 +30,14 @@ private static class MockEC2OndemandSlave extends EC2OndemandSlave { private static final long serialVersionUID = 1L; private MockEC2OndemandSlave(String name, String instanceId, String description, String remoteFS, - int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, - List> nodeProperties, String remoteAdmin, String jvmopts, - boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, - List tags, String cloudName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, - AMITypeData amiType, ConnectionStrategy connectionStrategy, - int maxTotalUses) + int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, + List> nodeProperties, String remoteAdmin, String jvmopts, + boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, + List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, + AMITypeData amiType, ConnectionStrategy connectionStrategy, + int maxTotalUses) throws Descriptor.FormException, IOException { - super(name, instanceId, description, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, connectionStrategy, maxTotalUses); + super(name, instanceId, description, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, false, launchTimeout, amiType, connectionStrategy, maxTotalUses); } @Override @@ -76,4 +76,4 @@ public long getUptime() throws AmazonClientException { return 3500000; } } -} +} \ No newline at end of file diff --git a/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml b/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml index e83f53ee2..9305771cc 100644 --- a/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml +++ b/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml @@ -34,5 +34,4 @@ type: T2Micro useDedicatedTenancy: false useEphemeralDevices: false - useHostTenancy: false useInstanceProfileForCredentials: true From ec7c1e334f154e14fdb3ba22c58e689407c5c5d6 Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Thu, 3 Sep 2020 17:01:01 +0530 Subject: [PATCH 04/26] Fixing padding --- .../SshHostKeyVerificationStrategyTest.java | 2 +- .../plugins/ec2/util/AmazonEC2FactoryMockImpl.java | 4 ++-- .../plugins/ec2/util/EC2AgentFactoryMockImpl.java | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java index de2cd0c7f..70edd58c7 100644 --- a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java @@ -298,7 +298,7 @@ Builder setState(InstanceState state) { connectionAttempt.state = state; return this; } - Builder setMessagesInLog(String[] messagesInLog) { + Builder setMessagesInLog(String[] messagesInLog) { connectionAttempt.messagesInLog = messagesInLog; return this; } diff --git a/src/test/java/hudson/plugins/ec2/util/AmazonEC2FactoryMockImpl.java b/src/test/java/hudson/plugins/ec2/util/AmazonEC2FactoryMockImpl.java index ae6cb68d0..15800e668 100644 --- a/src/test/java/hudson/plugins/ec2/util/AmazonEC2FactoryMockImpl.java +++ b/src/test/java/hudson/plugins/ec2/util/AmazonEC2FactoryMockImpl.java @@ -41,7 +41,7 @@ public class AmazonEC2FactoryMockImpl implements AmazonEC2Factory { */ public static AmazonEC2Client createAmazonEC2Mock() { instances = new ArrayList<>(); // Reset for each new mock. In the real world, the client is stateless, but this - // is convenient for testing. + // is convenient for testing. return createAmazonEC2Mock(null); } @@ -79,7 +79,7 @@ private static void mockDescribeRegions(AmazonEC2Client mock) { private static void mockDescribeInstances(AmazonEC2Client mock) { Mockito.doCallRealMethod().when(mock).describeInstances(); // This will just pass on to - // describeInstances(describeInstancesRequest) + // describeInstances(describeInstancesRequest) Mockito.doAnswer(invocationOnMock -> { DescribeInstancesRequest request = invocationOnMock.getArgument(0); if (request.getInstanceIds() != null && !request.getInstanceIds().isEmpty()) { diff --git a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java index 545995f80..f04f38aac 100644 --- a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java +++ b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java @@ -30,12 +30,12 @@ private static class MockEC2OndemandSlave extends EC2OndemandSlave { private static final long serialVersionUID = 1L; private MockEC2OndemandSlave(String name, String instanceId, String description, String remoteFS, - int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, - List> nodeProperties, String remoteAdmin, String jvmopts, - boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, - List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, - AMITypeData amiType, ConnectionStrategy connectionStrategy, - int maxTotalUses) + int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, + List> nodeProperties, String remoteAdmin, String jvmopts, + boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, + List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, + AMITypeData amiType, ConnectionStrategy connectionStrategy, + int maxTotalUses) throws Descriptor.FormException, IOException { super(name, instanceId, description, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, false, launchTimeout, amiType, connectionStrategy, maxTotalUses); } From e88d6e626915beac5ac154a5d927905879b7b484 Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Thu, 3 Sep 2020 17:03:00 +0530 Subject: [PATCH 05/26] Fixing padding --- .../SshHostKeyVerificationStrategyTest.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java index 70edd58c7..c1dce8437 100644 --- a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java @@ -30,14 +30,14 @@ public class SshHostKeyVerificationStrategyTest { private static final String COMPUTER_NAME = "MockInstanceForTest"; - + @ClassRule public static ConnectionRule conRule = new ConnectionRule(); - + @ClassRule public static LoggerRule loggerRule; - - @ClassRule + + @ClassRule public static JenkinsRule jenkins = new JenkinsRule(); /** @@ -54,7 +54,7 @@ public void verifyAllStrategiesTest() throws Exception { } // Return a list with all the strategies to check. Each element represents the strategy to check with the connection - // to the host and the assertion of the expected result on the console and the offline status of the instance. + // to the host and the assertion of the expected result on the console and the offline status of the instance. private List getStrategiesToTest() throws Exception { List strategiesToCheck = new ArrayList<>(); @@ -122,7 +122,7 @@ private StrategyTest forHardStrategyPrintedAndChanged() throws Exception { .addConnectionAttempt(builder().setConsole("A text before the key\n" + conRule.ED255219_PUB_KEY + "\n a bit more text") .setMessagesInLog(new String[]{ "has been successfully checked against the instance console"})) - + .addConnectionAttempt(builder().setConsole("The console doesn't matter, the key is already stored. We check against this one") .isOfflineByKey(true) .isChangeHostKey(true) @@ -183,7 +183,7 @@ private StrategyTest forOffStrategy() throws Exception { private ConnectionAttempt.Builder builder() { return new ConnectionAttempt.Builder(); } - + /** * A class to test a strategy. It stores the computer to connect to, the different configurations the computer is * passing through and the verifier used to connect to that computer. @@ -192,18 +192,18 @@ private static class StrategyTest { List connectionAttempts = new ArrayList<>(); MockEC2Computer computer; ServerHostKeyVerifierImpl verifier; - + public void check() throws Exception { for (ConnectionAttempt connectionAttempt : connectionAttempts) { connectionAttempt.attempt(); } } - + private StrategyTest(String computerSuffix, SshHostKeyVerificationStrategy strategy) throws Exception { computer = MockEC2Computer.createComputer(computerSuffix); verifier = new ServerHostKeyVerifierImpl(computer, strategy); } - + private StrategyTest addConnectionAttempt(ConnectionAttempt.Builder computerStateBuilder) { // The computer and verifier are the same for every computerState of the strategy. We set them here connectionAttempts.add(computerStateBuilder.build(computer, verifier, connectionAttempts.size() + 1)); @@ -222,12 +222,12 @@ private static class ConnectionAttempt { private InstanceState state = InstanceState.RUNNING; // Whether the real host key of the computer is changed before this step private boolean changeHostKey = false; - - // The expected messages the computer has printed out on the logs + + // The expected messages the computer has printed out on the logs private String[] messagesInLog = new String[]{}; // Whether the computer is set offline because a problem with the host key (it could be offline at the beginning) private boolean isOfflineByKey = false; - + // The computer and verifier used during the try of connection private MockEC2Computer computer; private ServerHostKeyVerifierImpl verifier; @@ -283,13 +283,13 @@ private void assertState() { assertThat(String.format("Stage %d. Log message not found on %s using %s strategy", stage, computer.getName(), verifier.strategy.getClass().getSimpleName()), loggerRule, LoggerRule.recorded(StringContains.containsString(messageInLog))); } } - + /** * A builder to build the attempt easily */ static class Builder { ConnectionAttempt connectionAttempt; - + Builder setConsole(String console) { connectionAttempt.console = console; return this; @@ -314,7 +314,7 @@ Builder isChangeHostKey(boolean changeHostKey) { Builder() { connectionAttempt = new ConnectionAttempt(); } - + private ConnectionAttempt build(MockEC2Computer computer, ServerHostKeyVerifierImpl verifier, int stage) { connectionAttempt.stage = stage; connectionAttempt.computer = computer; @@ -329,7 +329,7 @@ private static class MockEC2Computer extends EC2Computer { InstanceState state = InstanceState.PENDING; String console = null; EC2AbstractSlave slave; - + public MockEC2Computer(EC2AbstractSlave slave) { super(slave); this.slave = slave; @@ -370,8 +370,8 @@ public EC2AbstractSlave getNode() { public SlaveTemplate getSlaveTemplate() { return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); } - } - + } + // A verifier using the set strategy private static class ServerHostKeyVerifierImpl implements ServerHostKeyVerifier { private final EC2Computer computer; @@ -388,4 +388,4 @@ public boolean verifyServerHostKey(String hostname, int port, String serverHostK return strategy.verify(computer, new HostKey(serverHostKeyAlgorithm, serverHostKey), null); } } -} \ No newline at end of file +} From 3045a1386831597ae0d3ecd4ee6820d9c479eda8 Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Thu, 3 Sep 2020 17:08:13 +0530 Subject: [PATCH 06/26] Fixing padding --- .../plugins/ec2/AmazonEC2CloudTest.java | 2 +- .../plugins/ec2/AmazonEC2CloudUnitTest.java | 24 ++-- .../plugins/ec2/ConfigurationAsCodeTest.java | 2 +- .../plugins/ec2/EC2AbstractSlaveTest.java | 4 +- .../java/hudson/plugins/ec2/EC2CloudTest.java | 2 +- .../plugins/ec2/EC2OndemandSlaveTest.java | 2 +- .../plugins/ec2/EC2RetentionStrategyTest.java | 118 +++++++++--------- .../plugins/ec2/EC2SlaveMonitorTest.java | 18 +-- .../hudson/plugins/ec2/SlaveTemplateTest.java | 30 +++-- .../plugins/ec2/SlaveTemplateUnitTest.java | 2 +- .../plugins/ec2/TemplateLabelsTest.java | 2 +- .../ec2/util/AmazonEC2FactoryMockImpl.java | 2 +- .../ec2/util/EC2AgentFactoryMockImpl.java | 2 +- 13 files changed, 108 insertions(+), 102 deletions(-) diff --git a/src/test/java/hudson/plugins/ec2/AmazonEC2CloudTest.java b/src/test/java/hudson/plugins/ec2/AmazonEC2CloudTest.java index 49ab7decb..6e962ae20 100644 --- a/src/test/java/hudson/plugins/ec2/AmazonEC2CloudTest.java +++ b/src/test/java/hudson/plugins/ec2/AmazonEC2CloudTest.java @@ -93,4 +93,4 @@ private HtmlForm getConfigForm() throws IOException, SAXException { } } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/AmazonEC2CloudUnitTest.java b/src/test/java/hudson/plugins/ec2/AmazonEC2CloudUnitTest.java index 74b1648d9..06cf53481 100644 --- a/src/test/java/hudson/plugins/ec2/AmazonEC2CloudUnitTest.java +++ b/src/test/java/hudson/plugins/ec2/AmazonEC2CloudUnitTest.java @@ -54,8 +54,8 @@ /** - * Unit tests related to {@link AmazonEC2Cloud}, but do not require a Jenkins instance. - */ +* Unit tests related to {@link AmazonEC2Cloud}, but do not require a Jenkins instance. +*/ @PowerMockIgnore({"javax.crypto.*", "org.hamcrest.*", "javax.net.ssl.*", "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*"}) @RunWith(PowerMockRunner.class) @PrepareForTest({EC2Cloud.class, Jenkins.class}) @@ -73,16 +73,16 @@ public void testEC2EndpointURLCreation() throws MalformedURLException { @Test public void testInstaceCap() throws Exception { AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", - null, "key", null, Collections.emptyList(), - "roleArn", "roleSessionName"); + null, "key", null, Collections.emptyList(), + "roleArn", "roleSessionName"); assertEquals(cloud.getInstanceCap(), Integer.MAX_VALUE); assertEquals(cloud.getInstanceCapStr(), ""); final int cap = 3; final String capStr = String.valueOf(cap); cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", - null, "key", capStr, Collections.emptyList(), - "roleArn", "roleSessionName"); + null, "key", capStr, Collections.emptyList(), + "roleArn", "roleSessionName"); assertEquals(cloud.getInstanceCap(), cap); assertEquals(cloud.getInstanceCapStr(), capStr); } @@ -91,8 +91,8 @@ public void testInstaceCap() throws Exception { public void testSpotInstanceCount() throws Exception { final int numberOfSpotInstanceRequests = 105; AmazonEC2Cloud cloud = PowerMockito.spy(new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", - null, "key", null, Collections.emptyList(), - "roleArn", "roleSessionName")); + null, "key", null, Collections.emptyList(), + "roleArn", "roleSessionName")); PowerMockito.mockStatic(Jenkins.class); Jenkins jenkinsMock = mock(Jenkins.class); EC2SpotSlave spotSlaveMock = mock(EC2SpotSlave.class); @@ -106,15 +106,15 @@ public void testSpotInstanceCount() throws Exception { for(int i=0; i<=numberOfSpotInstanceRequests; i++) { instances.add(new Instance().withInstanceId("id"+i).withTags(new Tag().withKey("jenkins_slave_type").withValue("spot"))); } - + AmazonEC2FactoryMockImpl.instances = instances; - + Mockito.doReturn(AmazonEC2FactoryMockImpl.createAmazonEC2Mock(null)).when(cloud).connect(); Object[] params = {null, "jenkinsurl", new HashSet()}; int n = Whitebox.invokeMethod(cloud, "countCurrentEC2SpotSlaves", params); - + // Should equal number of spot instance requests + 1 for spot nodes not having a spot instance request assertEquals(numberOfSpotInstanceRequests+1, n); } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java b/src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java index 12a411112..ac9c83543 100644 --- a/src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java +++ b/src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java @@ -145,4 +145,4 @@ public void testConfigAsCodeExport() throws Exception { String expected = toStringFromYamlFile(this, "UnixDataExport.yml"); assertEquals(expected, exported); } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java index 4f5999136..1ae4adaff 100644 --- a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java @@ -31,7 +31,7 @@ public void terminate() { @Override public String getEc2Type() { return null; // To change body of implemented methods use File | - // Settings | File Templates. + // Settings | File Templates. } }; @@ -58,4 +58,4 @@ public String getEc2Type() { }; assertEquals(-1, slave.maxTotalUses); } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/EC2CloudTest.java b/src/test/java/hudson/plugins/ec2/EC2CloudTest.java index 67deab30f..40ac36588 100644 --- a/src/test/java/hudson/plugins/ec2/EC2CloudTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2CloudTest.java @@ -76,4 +76,4 @@ public Void answer(InvocationOnMock invocation) { Node[] expectedNodes = {mockOrphanNode}; assertArrayEquals(expectedNodes, listOfJenkinsNodes.toArray()); } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java b/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java index fef4762d0..39d5d2725 100644 --- a/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java @@ -23,4 +23,4 @@ public void testSpecifyMode() throws Exception { assertEquals(Node.Mode.EXCLUSIVE, slaveExclusive.getMode()); } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java index 5f45f6331..18aefd8a8 100644 --- a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java @@ -207,19 +207,19 @@ public void testInternalCheckRespectsWait() throws Exception { public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -230,9 +230,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check too assertEquals(2, computers.size()); @@ -242,9 +242,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { cloud.provision(template, 1); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have three slaves before any checking assertEquals(3, computers.size()); @@ -254,9 +254,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check assertEquals(2, computers.size()); @@ -266,9 +266,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { @Test public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -290,15 +290,15 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -309,9 +309,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check too assertEquals(2, computers.size()); @@ -322,9 +322,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws @Test public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -346,15 +346,15 @@ public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Excep MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have zero slaves assertEquals(0, computers.size()); @@ -363,9 +363,9 @@ public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Excep @Test public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidnight() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("15:00"); @@ -387,15 +387,15 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -406,9 +406,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check too assertEquals(2, computers.size()); @@ -418,9 +418,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni @Test public void testRetentionStopsAfterActiveRangeEnds() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -441,15 +441,15 @@ public void testRetentionStopsAfterActiveRangeEnds() throws Exception { MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -464,9 +464,9 @@ public void testRetentionStopsAfterActiveRangeEnds() throws Exception { checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have 1 slaves after check assertEquals(1, computers.size()); @@ -478,4 +478,4 @@ private static void checkRetentionStrategy(EC2RetentionStrategy rs, EC2Computer EC2AbstractSlave node = c.getNode(); assertTrue(node.terminateScheduled.await(10, TimeUnit.SECONDS)); } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java b/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java index 64bbe97d4..a8def2cc7 100644 --- a/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java @@ -41,17 +41,17 @@ public void testMinimumNumberOfInstances() throws Exception { public void testMinimumNumberOfSpareInstances() throws Exception { // Arguments split onto newlines matching the construtor definition to make figuring which is which easier. SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "defaultsecgroup", "remotefs", - InstanceType.M1Large, false, "label", Node.Mode.NORMAL, "description", "init script", - "tmpdir", "userdata", "10", "remoteadmin", null, "-Xmx1g", - false, "subnet 456", null, "0", 0, - 2, null, null, true, - true, false, "", false, - "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, - null); + InstanceType.M1Large, false, "label", Node.Mode.NORMAL, "description", "init script", + "tmpdir", "userdata", "10", "remoteadmin", null, "-Xmx1g", + false, "subnet 456", null, "0", 0, + 2, null, null, true, + true, false, "", false, + "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, + null); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", Collections.singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); Assert.assertEquals(2, Arrays.stream(Jenkins.get().getComputers()).filter(computer -> computer instanceof EC2Computer).count()); } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java index aba9d09e5..416ca10ef 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java @@ -49,16 +49,22 @@ import hudson.plugins.ec2.SlaveTemplate.ProvisionOptions; import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig; import com.amazonaws.services.ec2.model.Reservation; +import hudson.plugins.ec2.util.PrivateKeyHelper; import jenkins.model.Jenkins; import net.sf.json.JSONObject; +import org.apache.commons.math3.analysis.function.Power; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.runner.RunWith; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.mockito.ArgumentCaptor; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.modules.junit4.PowerMockRunner; import java.util.ArrayList; import java.util.Collections; @@ -106,7 +112,7 @@ public void testConfigRoundtrip() throws Exception { } @Test - public void testConfigRoundtripWithHostTenancy() throws Exception { + public void testConfigRoundtripHostTenancy() throws Exception { String ami = "ami1"; String description = "foo ami"; @@ -116,7 +122,7 @@ public void testConfigRoundtripWithHostTenancy() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false,true, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, true,"", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -188,7 +194,7 @@ public void testConfigRoundtripWithCustomSSHHostKeyVerificationStrategy() throws // We check this one is set final HostKeyVerificationStrategyEnum STRATEGY_TO_CHECK = HostKeyVerificationStrategyEnum.OFF; - + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, STRATEGY_TO_CHECK); List templates = new ArrayList(); @@ -502,8 +508,8 @@ public void testMinimumNumberOfInstancesActiveRangeConfig() throws Exception { Assert.assertEquals(true, stored.getMinimumNoInstancesActiveTimeRangeDays().get("tuesday")); } - @Test - public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { + @Test + public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { boolean associatePublicIp = false; String ami = "ami1"; String description = "foo ami"; @@ -543,10 +549,10 @@ public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { assertEquals(actualRequest.getSecurityGroups(), Stream.of(securityGroups).collect(Collectors.toList())); } } - } + } - @Test - public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Exception { + @Test + public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Exception { boolean associatePublicIp = true; String ami = "ami1"; String description = "foo ami"; @@ -583,9 +589,9 @@ public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Except assertEquals(actualRequest.getSecurityGroupIds(), Collections.emptyList()); assertEquals(actualRequest.getSecurityGroups(), Collections.emptyList()); } - } + } - private AmazonEC2 setupTestForProvisioning(SlaveTemplate template) throws Exception { + private AmazonEC2 setupTestForProvisioning(SlaveTemplate template) throws Exception { AmazonEC2Cloud mockedCloud = mock(AmazonEC2Cloud.class); AmazonEC2 mockedEC2 = mock(AmazonEC2.class); EC2PrivateKey mockedPrivateKey = mock(EC2PrivateKey.class); @@ -637,5 +643,5 @@ private AmazonEC2 setupTestForProvisioning(SlaveTemplate template) throws Except when(mockedEC2.runInstances(any(RunInstancesRequest.class))).thenReturn(mockedResult); return mockedEC2; - } -} \ No newline at end of file + } +} diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java index 07d5d8f29..a3839035b 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java @@ -131,4 +131,4 @@ public void publish(LogRecord record) { public List getRecords() { return records; } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java b/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java index 64df1b4a5..8acd5eeaa 100644 --- a/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java +++ b/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java @@ -109,4 +109,4 @@ public void testExclusiveModeEmptyLabel() throws Exception { assertEquals(false, ac.canProvision(null)); } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/util/AmazonEC2FactoryMockImpl.java b/src/test/java/hudson/plugins/ec2/util/AmazonEC2FactoryMockImpl.java index 15800e668..6d033b3f6 100644 --- a/src/test/java/hudson/plugins/ec2/util/AmazonEC2FactoryMockImpl.java +++ b/src/test/java/hudson/plugins/ec2/util/AmazonEC2FactoryMockImpl.java @@ -182,4 +182,4 @@ public AmazonEC2 connect(AWSCredentialsProvider credentialsProvider, URL ec2Endp } return mock; } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java index f04f38aac..4a6b75c67 100644 --- a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java +++ b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java @@ -76,4 +76,4 @@ public long getUptime() throws AmazonClientException { return 3500000; } } -} \ No newline at end of file +} From 23b9f2c26f942654ad546404dbae8120e444736f Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Thu, 3 Sep 2020 17:13:26 +0530 Subject: [PATCH 07/26] Fixing padding --- .../hudson/plugins/ec2/SlaveTemplate.java | 106 ++++++++++++++++-- 1 file changed, 96 insertions(+), 10 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index bdba89e73..8245fde37 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -23,16 +23,20 @@ import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.services.ec2.AmazonEC2; import com.amazonaws.services.ec2.model.AmazonEC2Exception; +import com.amazonaws.services.ec2.model.AvailabilityZone; import com.amazonaws.services.ec2.model.BlockDeviceMapping; import com.amazonaws.services.ec2.model.CancelSpotInstanceRequestsRequest; import com.amazonaws.services.ec2.model.CreateTagsRequest; import com.amazonaws.services.ec2.model.CreditSpecificationRequest; +import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult; import com.amazonaws.services.ec2.model.DescribeImagesRequest; import com.amazonaws.services.ec2.model.DescribeInstancesRequest; import com.amazonaws.services.ec2.model.DescribeInstancesResult; import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest; import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; import com.amazonaws.services.ec2.model.DescribeSpotInstanceRequestsRequest; +import com.amazonaws.services.ec2.model.DescribeSpotPriceHistoryRequest; +import com.amazonaws.services.ec2.model.DescribeSpotPriceHistoryResult; import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; import com.amazonaws.services.ec2.model.DescribeSubnetsResult; import com.amazonaws.services.ec2.model.Filter; @@ -57,6 +61,7 @@ import com.amazonaws.services.ec2.model.SpotInstanceRequest; import com.amazonaws.services.ec2.model.SpotMarketOptions; import com.amazonaws.services.ec2.model.SpotPlacement; +import com.amazonaws.services.ec2.model.SpotPrice; import com.amazonaws.services.ec2.model.StartInstancesRequest; import com.amazonaws.services.ec2.model.StartInstancesResult; import com.amazonaws.services.ec2.model.Subnet; @@ -121,11 +126,92 @@ import java.util.stream.Stream; import javax.annotation.CheckForNull; +import javax.servlet.ServletException; +import hudson.plugins.ec2.util.AmazonEC2Factory; +import hudson.plugins.ec2.util.DeviceMappingParser; +import hudson.plugins.ec2.util.EC2AgentConfig; +import hudson.plugins.ec2.util.EC2AgentFactory; +import hudson.plugins.ec2.util.MinimumInstanceChecker; +import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig; import edu.umd.cs.findbugs.annotations.NonNull; +import hudson.XmlFile; +import hudson.model.listeners.SaveableListener; import hudson.security.Permission; +import hudson.util.Secret; +import jenkins.model.Jenkins; +import jenkins.model.JenkinsLocationConfiguration; +import jenkins.slaves.iterators.api.NodeIterator; +import org.apache.commons.lang.StringUtils; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.DataBoundSetter; +import org.kohsuke.stapler.QueryParameter; + +import com.amazonaws.AmazonClientException; +import com.amazonaws.AmazonServiceException; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.services.ec2.AmazonEC2; +import com.amazonaws.services.ec2.model.AmazonEC2Exception; +import com.amazonaws.services.ec2.model.BlockDeviceMapping; +import com.amazonaws.services.ec2.model.CancelSpotInstanceRequestsRequest; +import com.amazonaws.services.ec2.model.CreateTagsRequest; +import com.amazonaws.services.ec2.model.CreditSpecificationRequest; +import com.amazonaws.services.ec2.model.DescribeImagesRequest; +import com.amazonaws.services.ec2.model.DescribeInstancesRequest; +import com.amazonaws.services.ec2.model.DescribeInstancesResult; +import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest; +import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; +import com.amazonaws.services.ec2.model.DescribeSpotInstanceRequestsRequest; +import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; +import com.amazonaws.services.ec2.model.DescribeSubnetsResult; +import com.amazonaws.services.ec2.model.Filter; +import com.amazonaws.services.ec2.model.IamInstanceProfileSpecification; +import com.amazonaws.services.ec2.model.Image; +import com.amazonaws.services.ec2.model.Instance; +import com.amazonaws.services.ec2.model.InstanceMarketOptionsRequest; +import com.amazonaws.services.ec2.model.InstanceNetworkInterfaceSpecification; +import com.amazonaws.services.ec2.model.InstanceStateName; +import com.amazonaws.services.ec2.model.InstanceType; +import com.amazonaws.services.ec2.model.KeyPair; +import com.amazonaws.services.ec2.model.LaunchSpecification; +import com.amazonaws.services.ec2.model.MarketType; +import com.amazonaws.services.ec2.model.Placement; +import com.amazonaws.services.ec2.model.RequestSpotInstancesRequest; +import com.amazonaws.services.ec2.model.RequestSpotInstancesResult; +import com.amazonaws.services.ec2.model.Reservation; +import com.amazonaws.services.ec2.model.ResourceType; +import com.amazonaws.services.ec2.model.RunInstancesRequest; +import com.amazonaws.services.ec2.model.SecurityGroup; +import com.amazonaws.services.ec2.model.ShutdownBehavior; +import com.amazonaws.services.ec2.model.SpotInstanceRequest; +import com.amazonaws.services.ec2.model.SpotMarketOptions; +import com.amazonaws.services.ec2.model.SpotPlacement; +import com.amazonaws.services.ec2.model.StartInstancesRequest; +import com.amazonaws.services.ec2.model.StartInstancesResult; +import com.amazonaws.services.ec2.model.Subnet; +import com.amazonaws.services.ec2.model.Tag; +import com.amazonaws.services.ec2.model.TagSpecification; + +import hudson.Extension; +import hudson.Util; +import hudson.model.Describable; +import hudson.model.Descriptor; +import hudson.model.Descriptor.FormException; +import hudson.model.Hudson; +import hudson.model.Label; +import hudson.model.Node; +import hudson.model.Saveable; +import hudson.model.TaskListener; +import hudson.model.labels.LabelAtom; +import hudson.slaves.NodeProperty; +import hudson.slaves.NodePropertyDescriptor; +import hudson.util.DescribableList; +import hudson.util.FormValidation; +import hudson.util.ListBoxModel; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -450,11 +536,11 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, useEphemeralDevices, @@ -466,11 +552,11 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri * Backward compatible constructor for reloading previous version data */ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, - String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, - String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - String launchTimeoutStr) { + String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, + String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, + String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + String launchTimeoutStr) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, new UnixData(rootCommandPrefix, slaveCommandPrefix, slaveCommandSuffix, sshPort), jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, From 3729123fa2de9a48012060a2b529ed1da063eaaf Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Thu, 3 Sep 2020 17:14:50 +0530 Subject: [PATCH 08/26] Fixing padding --- src/main/java/hudson/plugins/ec2/EC2SpotSlave.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java b/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java index 1e786fdc7..6a9fee8d2 100644 --- a/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java @@ -90,8 +90,8 @@ public void terminate() { if (instanceId != null && !instanceId.equals("")) { if (!super.isAlive(true)) { /* - * The node has been killed externally, so we've nothing to do here - */ + * The node has been killed externally, so we've nothing to do here + */ LOGGER.info("EC2 instance already terminated: " + instanceId); } else { TerminateInstancesRequest request = new TerminateInstancesRequest(Collections.singletonList(instanceId)); @@ -223,4 +223,4 @@ public String getEc2ReadinessStatus() { } throw new AmazonClientException("No spot instance request"); } -} \ No newline at end of file +} From 760620fd47c42fb290ffa112135bbc8d86dd71a0 Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Thu, 3 Sep 2020 17:17:06 +0530 Subject: [PATCH 09/26] Fixing padding --- src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java index 58295720e..6752c7bbf 100644 --- a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java @@ -63,12 +63,11 @@ public EC2OndemandSlave(String name, String instanceId, String templateDescripti this.useHostTenancy = useHostTenancy; } - /** * Constructor for debugging. */ public EC2OndemandSlave(String instanceId) throws FormException, IOException { - this(instanceId, instanceId, "debug", "/tmp/hudson", 1, "debug", Mode.NORMAL, "", "/tmp", Collections.emptyList(), null, null, false, null, "Fake public", "Fake private", null, null, false,false, 0, new UnixData(null, null, null, null), ConnectionStrategy.PRIVATE_IP, -1); + this(instanceId, instanceId, "debug", "/tmp/hudson", 1, "debug", Mode.NORMAL, "", "/tmp", Collections.emptyList(), null, null, false, null, "Fake public", "Fake private", null, null, false, false, 0, new UnixData(null, null, null, null), ConnectionStrategy.PRIVATE_IP, -1); } /** @@ -82,8 +81,8 @@ public void terminate() { try { if (!isAlive(true)) { /* - * The node has been killed externally, so we've nothing to do here - */ + * The node has been killed externally, so we've nothing to do here + */ LOGGER.info("EC2 instance already terminated: " + getInstanceId()); } else { AmazonEC2 ec2 = getCloud().connect(); @@ -140,4 +139,4 @@ public String getDisplayName() { public String getEc2Type() { return Messages.EC2OndemandSlave_OnDemand(); } -} \ No newline at end of file +} From a513eba6d9b108efa5d06f0acb0433852849f935 Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Mon, 7 Sep 2020 13:34:24 +0530 Subject: [PATCH 10/26] fixing tests --- .../hudson/plugins/ec2/EC2AbstractSlave.java | 9 +- .../hudson/plugins/ec2/EC2OndemandSlave.java | 9 +- .../java/hudson/plugins/ec2/EC2SpotSlave.java | 2 +- .../hudson/plugins/ec2/SlaveTemplate.java | 243 ++++++------------ .../plugins/ec2/EC2AbstractSlaveTest.java | 4 +- .../plugins/ec2/EC2RetentionStrategyTest.java | 4 +- .../hudson/plugins/ec2/SlaveTemplateTest.java | 32 +-- .../SshHostKeyVerificationStrategyTest.java | 2 +- .../hudson/plugins/ec2/UnixDataExport.yml | 1 + 9 files changed, 116 insertions(+), 190 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java index b67b28644..75d779ec5 100644 --- a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java @@ -93,7 +93,7 @@ public abstract class EC2AbstractSlave extends Slave { public final boolean stopOnTerminate; public final String idleTerminationMinutes; public final boolean useDedicatedTenancy; - public boolean useHostTenancy; + public final boolean useHostTenancy; public boolean isConnected = false; public List tags; public final String cloudName; @@ -141,7 +141,7 @@ public abstract class EC2AbstractSlave extends Slave { public static final String TEST_ZONE = "testZone"; - public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) + public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) throws FormException, IOException { super(name, remoteFS, launcher); @@ -162,6 +162,7 @@ public EC2AbstractSlave(String name, String instanceId, String templateDescripti this.tags = tags; this.usePrivateDnsName = connectionStrategy == ConnectionStrategy.PRIVATE_DNS; this.useDedicatedTenancy = useDedicatedTenancy; + this.useHostTenancy = useHostTenancy; this.cloudName = cloudName; this.launchTimeout = launchTimeout; this.amiType = amiType; @@ -171,9 +172,9 @@ public EC2AbstractSlave(String name, String instanceId, String templateDescripti } @Deprecated - public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) + public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); + this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); } @Override diff --git a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java index 6752c7bbf..7893d3dbd 100644 --- a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java @@ -51,16 +51,21 @@ public EC2OndemandSlave(String instanceId, String templateDescription, String re this(templateDescription + " (" + instanceId + ")", instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, Collections.emptyList(), remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, false, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); } + @Deprecated + public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType) + throws FormException, IOException { + this(templateDescription + " (" + instanceId + ")", instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, Collections.emptyList(), remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); + } + @DataBoundConstructor public EC2OndemandSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) throws FormException, IOException { super(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, amiType.isWindows() ? new EC2WindowsLauncher() - : new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, launchTimeout, amiType, connectionStrategy, maxTotalUses); + : new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, connectionStrategy, maxTotalUses); this.publicDNS = publicDNS; this.privateDNS = privateDNS; - this.useHostTenancy = useHostTenancy; } /** diff --git a/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java b/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java index 6a9fee8d2..c98dfbc47 100644 --- a/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java @@ -51,7 +51,7 @@ public EC2SpotSlave(String name, String spotInstanceRequestId, String templateDe throws FormException, IOException { super(name, "", templateDescription, remoteFS, numExecutors, mode, labelString, amiType.isWindows() ? new EC2WindowsLauncher() : - new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, false, idleTerminationMinutes, tags, cloudName, false, launchTimeout, amiType, connectionStrategy, maxTotalUses); + new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, false, idleTerminationMinutes, tags, cloudName, false, false, launchTimeout, amiType, connectionStrategy, maxTotalUses); this.name = name; this.spotInstanceRequestId = spotInstanceRequestId; diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index 8245fde37..f7f79579d 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -23,20 +23,16 @@ import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.services.ec2.AmazonEC2; import com.amazonaws.services.ec2.model.AmazonEC2Exception; -import com.amazonaws.services.ec2.model.AvailabilityZone; import com.amazonaws.services.ec2.model.BlockDeviceMapping; import com.amazonaws.services.ec2.model.CancelSpotInstanceRequestsRequest; import com.amazonaws.services.ec2.model.CreateTagsRequest; import com.amazonaws.services.ec2.model.CreditSpecificationRequest; -import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult; import com.amazonaws.services.ec2.model.DescribeImagesRequest; import com.amazonaws.services.ec2.model.DescribeInstancesRequest; import com.amazonaws.services.ec2.model.DescribeInstancesResult; import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest; import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; import com.amazonaws.services.ec2.model.DescribeSpotInstanceRequestsRequest; -import com.amazonaws.services.ec2.model.DescribeSpotPriceHistoryRequest; -import com.amazonaws.services.ec2.model.DescribeSpotPriceHistoryResult; import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; import com.amazonaws.services.ec2.model.DescribeSubnetsResult; import com.amazonaws.services.ec2.model.Filter; @@ -61,7 +57,6 @@ import com.amazonaws.services.ec2.model.SpotInstanceRequest; import com.amazonaws.services.ec2.model.SpotMarketOptions; import com.amazonaws.services.ec2.model.SpotPlacement; -import com.amazonaws.services.ec2.model.SpotPrice; import com.amazonaws.services.ec2.model.StartInstancesRequest; import com.amazonaws.services.ec2.model.StartInstancesResult; import com.amazonaws.services.ec2.model.Subnet; @@ -126,92 +121,11 @@ import java.util.stream.Stream; import javax.annotation.CheckForNull; -import javax.servlet.ServletException; -import hudson.plugins.ec2.util.AmazonEC2Factory; -import hudson.plugins.ec2.util.DeviceMappingParser; -import hudson.plugins.ec2.util.EC2AgentConfig; -import hudson.plugins.ec2.util.EC2AgentFactory; -import hudson.plugins.ec2.util.MinimumInstanceChecker; -import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig; import edu.umd.cs.findbugs.annotations.NonNull; -import hudson.XmlFile; -import hudson.model.listeners.SaveableListener; import hudson.security.Permission; -import hudson.util.Secret; -import jenkins.model.Jenkins; -import jenkins.model.JenkinsLocationConfiguration; -import jenkins.slaves.iterators.api.NodeIterator; - -import org.apache.commons.lang.StringUtils; -import org.kohsuke.accmod.Restricted; -import org.kohsuke.accmod.restrictions.NoExternalUse; -import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.DataBoundSetter; -import org.kohsuke.stapler.QueryParameter; -import com.amazonaws.AmazonClientException; -import com.amazonaws.AmazonServiceException; -import com.amazonaws.auth.AWSCredentialsProvider; -import com.amazonaws.services.ec2.AmazonEC2; -import com.amazonaws.services.ec2.model.AmazonEC2Exception; -import com.amazonaws.services.ec2.model.BlockDeviceMapping; -import com.amazonaws.services.ec2.model.CancelSpotInstanceRequestsRequest; -import com.amazonaws.services.ec2.model.CreateTagsRequest; -import com.amazonaws.services.ec2.model.CreditSpecificationRequest; -import com.amazonaws.services.ec2.model.DescribeImagesRequest; -import com.amazonaws.services.ec2.model.DescribeInstancesRequest; -import com.amazonaws.services.ec2.model.DescribeInstancesResult; -import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest; -import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; -import com.amazonaws.services.ec2.model.DescribeSpotInstanceRequestsRequest; -import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; -import com.amazonaws.services.ec2.model.DescribeSubnetsResult; -import com.amazonaws.services.ec2.model.Filter; -import com.amazonaws.services.ec2.model.IamInstanceProfileSpecification; -import com.amazonaws.services.ec2.model.Image; -import com.amazonaws.services.ec2.model.Instance; -import com.amazonaws.services.ec2.model.InstanceMarketOptionsRequest; -import com.amazonaws.services.ec2.model.InstanceNetworkInterfaceSpecification; -import com.amazonaws.services.ec2.model.InstanceStateName; -import com.amazonaws.services.ec2.model.InstanceType; -import com.amazonaws.services.ec2.model.KeyPair; -import com.amazonaws.services.ec2.model.LaunchSpecification; -import com.amazonaws.services.ec2.model.MarketType; -import com.amazonaws.services.ec2.model.Placement; -import com.amazonaws.services.ec2.model.RequestSpotInstancesRequest; -import com.amazonaws.services.ec2.model.RequestSpotInstancesResult; -import com.amazonaws.services.ec2.model.Reservation; -import com.amazonaws.services.ec2.model.ResourceType; -import com.amazonaws.services.ec2.model.RunInstancesRequest; -import com.amazonaws.services.ec2.model.SecurityGroup; -import com.amazonaws.services.ec2.model.ShutdownBehavior; -import com.amazonaws.services.ec2.model.SpotInstanceRequest; -import com.amazonaws.services.ec2.model.SpotMarketOptions; -import com.amazonaws.services.ec2.model.SpotPlacement; -import com.amazonaws.services.ec2.model.StartInstancesRequest; -import com.amazonaws.services.ec2.model.StartInstancesResult; -import com.amazonaws.services.ec2.model.Subnet; -import com.amazonaws.services.ec2.model.Tag; -import com.amazonaws.services.ec2.model.TagSpecification; - -import hudson.Extension; -import hudson.Util; -import hudson.model.Describable; -import hudson.model.Descriptor; -import hudson.model.Descriptor.FormException; -import hudson.model.Hudson; -import hudson.model.Label; -import hudson.model.Node; -import hudson.model.Saveable; -import hudson.model.TaskListener; -import hudson.model.labels.LabelAtom; -import hudson.slaves.NodeProperty; -import hudson.slaves.NodePropertyDescriptor; -import hudson.util.DescribableList; -import hudson.util.FormValidation; -import hudson.util.ListBoxModel; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -340,7 +254,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, List> nodeProperties, HostKeyVerificationStrategyEnum hostKeyVerificationStrategy) { @@ -376,6 +290,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri this.associatePublicIp = associatePublicIp; this.connectionStrategy = connectionStrategy == null ? ConnectionStrategy.PRIVATE_IP : connectionStrategy; this.useDedicatedTenancy = useDedicatedTenancy; + this.useHostTenancy = useHostTenancy; this.connectBySSHProcess = connectBySSHProcess; this.maxTotalUses = maxTotalUses; this.nodeProperties = new DescribableList<>(Saveable.NOOP, Util.fixNull(nodeProperties)); @@ -406,27 +321,27 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri this.customDeviceMapping = customDeviceMapping; this.t2Unlimited = t2Unlimited; - this.hostKeyVerificationStrategy = hostKeyVerificationStrategy != null ? hostKeyVerificationStrategy : HostKeyVerificationStrategyEnum.CHECK_NEW_SOFT; - + this.hostKeyVerificationStrategy = hostKeyVerificationStrategy != null ? hostKeyVerificationStrategy : HostKeyVerificationStrategyEnum.CHECK_NEW_SOFT; + readResolve(); // initialize } @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, - List> nodeProperties) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, + List> nodeProperties) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, minimumNumberOfSpareInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, + useEphemeralDevices, useDedicatedTenancy, useHostTenancy ,launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, nodeProperties, null); @@ -434,13 +349,34 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses,List> nodeProperties ) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, + List> nodeProperties) { + this(ami, zone, spotConfig, securityGroups, remoteFS, + type, ebsOptimized, labelString, mode, description, initScript, + tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, + stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, + minimumNumberOfSpareInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, + useEphemeralDevices, useDedicatedTenancy, false,launchTimeoutStr, associatePublicIp, + customDeviceMapping, connectBySSHProcess, monitoring, + t2Unlimited, connectionStrategy, maxTotalUses, + nodeProperties, null); + } + + @Deprecated + public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses,List> nodeProperties ) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, @@ -450,13 +386,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, @@ -474,21 +410,21 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, - tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, - idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, - monitoring, t2Unlimited, connectionStrategy, maxTotalUses); + tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, + idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + monitoring, t2Unlimited, connectionStrategy, maxTotalUses); } @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, boolean monitoring, - boolean t2Unlimited) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, boolean monitoring, + boolean t2Unlimited) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, @@ -497,12 +433,12 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, @@ -511,12 +447,12 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, - boolean connectBySSHProcess) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, + boolean connectBySSHProcess) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, false, useEphemeralDevices, @@ -524,45 +460,34 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { - this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, - tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, - idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, false); - } - - public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, false); - this.useHostTenancy = useHostTenancy; } /** * Backward compatible constructor for reloading previous version data */ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, - String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, - String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - String launchTimeoutStr) { + String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, + String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, + String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + String launchTimeoutStr) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, new UnixData(rootCommandPrefix, slaveCommandPrefix, slaveCommandSuffix, sshPort), jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, - useEphemeralDevices, false,false, launchTimeoutStr, false, null); + useEphemeralDevices, false, launchTimeoutStr, false, null); } + + public boolean isConnectBySSHProcess() { // See // src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-connectBySSHProcess.html diff --git a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java index 1ae4adaff..5a69aa7df 100644 --- a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java @@ -21,7 +21,7 @@ public class EC2AbstractSlaveTest { @Test public void testGetLaunchTimeoutInMillisShouldNotOverflow() throws Exception { - EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, -1) { + EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "cloud", false,false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, -1) { @Override public void terminate() { // To change body of implemented methods use File | Settings | @@ -46,7 +46,7 @@ public void testMaxUsesBackwardCompat() throws Exception { templates.add(orig); AmazonEC2Cloud ac = new AmazonEC2Cloud("us-east-1", false, "abc", "us-east-1", "ghi", "3", templates, null, null); r.jenkins.clouds.add(ac); - EC2AbstractSlave slave = new EC2AbstractSlave("name", "", description, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "ec2-us-east-1", false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, 0) { + EC2AbstractSlave slave = new EC2AbstractSlave("name", "", description, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "ec2-us-east-1", false,false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, 0) { @Override public void terminate() { } diff --git a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java index 18aefd8a8..875e06607 100644 --- a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java @@ -68,7 +68,7 @@ public void testOnBillingHourRetention() throws Exception { } private EC2Computer computerWithIdleTime(final int minutes, final int seconds) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { + final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false,false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { @Override public void terminate() { } @@ -147,7 +147,7 @@ public void testOnUsageCountRetention() throws Exception { } private EC2Computer computerWithUsageLimit(final int usageLimit) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, usageLimit) { + final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false,false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, usageLimit) { @Override public void terminate() { terminateCalled.set(true); diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java index 416ca10ef..cec320a7e 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java @@ -49,22 +49,16 @@ import hudson.plugins.ec2.SlaveTemplate.ProvisionOptions; import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig; import com.amazonaws.services.ec2.model.Reservation; -import hudson.plugins.ec2.util.PrivateKeyHelper; import jenkins.model.Jenkins; import net.sf.json.JSONObject; -import org.apache.commons.math3.analysis.function.Power; import org.junit.Assert; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.runner.RunWith; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.mockito.ArgumentCaptor; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.modules.junit4.PowerMockRunner; import java.util.ArrayList; import java.util.Collections; @@ -112,7 +106,7 @@ public void testConfigRoundtrip() throws Exception { } @Test - public void testConfigRoundtripHostTenancy() throws Exception { + public void testConfigRoundtripWithHostTenancy() throws Exception { String ami = "ami1"; String description = "foo ami"; @@ -122,7 +116,7 @@ public void testConfigRoundtripHostTenancy() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, true,"", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null,0,0 ,"", "", false, false, false, true, "", false,"", false, false , false,ConnectionStrategy.PUBLIC_IP, -1,null); List templates = new ArrayList(); templates.add(orig); @@ -194,8 +188,8 @@ public void testConfigRoundtripWithCustomSSHHostKeyVerificationStrategy() throws // We check this one is set final HostKeyVerificationStrategyEnum STRATEGY_TO_CHECK = HostKeyVerificationStrategyEnum.OFF; - - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, STRATEGY_TO_CHECK); + + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, false,"", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, STRATEGY_TO_CHECK); List templates = new ArrayList(); templates.add(orig); @@ -508,8 +502,8 @@ public void testMinimumNumberOfInstancesActiveRangeConfig() throws Exception { Assert.assertEquals(true, stored.getMinimumNoInstancesActiveTimeRangeDays().get("tuesday")); } - @Test - public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { + @Test + public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { boolean associatePublicIp = false; String ami = "ami1"; String description = "foo ami"; @@ -549,10 +543,10 @@ public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { assertEquals(actualRequest.getSecurityGroups(), Stream.of(securityGroups).collect(Collectors.toList())); } } - } + } - @Test - public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Exception { + @Test + public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Exception { boolean associatePublicIp = true; String ami = "ami1"; String description = "foo ami"; @@ -589,9 +583,9 @@ public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Except assertEquals(actualRequest.getSecurityGroupIds(), Collections.emptyList()); assertEquals(actualRequest.getSecurityGroups(), Collections.emptyList()); } - } + } - private AmazonEC2 setupTestForProvisioning(SlaveTemplate template) throws Exception { + private AmazonEC2 setupTestForProvisioning(SlaveTemplate template) throws Exception { AmazonEC2Cloud mockedCloud = mock(AmazonEC2Cloud.class); AmazonEC2 mockedEC2 = mock(AmazonEC2.class); EC2PrivateKey mockedPrivateKey = mock(EC2PrivateKey.class); @@ -643,5 +637,5 @@ private AmazonEC2 setupTestForProvisioning(SlaveTemplate template) throws Except when(mockedEC2.runInstances(any(RunInstancesRequest.class))).thenReturn(mockedResult); return mockedEC2; - } -} + } +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java index c1dce8437..85e4e6e4c 100644 --- a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java @@ -337,7 +337,7 @@ public MockEC2Computer(EC2AbstractSlave slave) { // Create a computer private static MockEC2Computer createComputer(String suffix) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave(COMPUTER_NAME + suffix, "id" + suffix, "description" + suffix, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { + final EC2AbstractSlave slave = new EC2AbstractSlave(COMPUTER_NAME + suffix, "id" + suffix, "description" + suffix, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false,false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { @Override public void terminate() { } diff --git a/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml b/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml index 9305771cc..e83f53ee2 100644 --- a/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml +++ b/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml @@ -34,4 +34,5 @@ type: T2Micro useDedicatedTenancy: false useEphemeralDevices: false + useHostTenancy: false useInstanceProfileForCredentials: true From b663d3e77dd22f4bf7811873cc47b9ea39ee96fb Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Mon, 7 Sep 2020 13:36:39 +0530 Subject: [PATCH 11/26] fixing tests --- .../hudson/plugins/ec2/SlaveTemplate.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index f7f79579d..cac34fcad 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -23,16 +23,20 @@ import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.services.ec2.AmazonEC2; import com.amazonaws.services.ec2.model.AmazonEC2Exception; +import com.amazonaws.services.ec2.model.AvailabilityZone; import com.amazonaws.services.ec2.model.BlockDeviceMapping; import com.amazonaws.services.ec2.model.CancelSpotInstanceRequestsRequest; import com.amazonaws.services.ec2.model.CreateTagsRequest; import com.amazonaws.services.ec2.model.CreditSpecificationRequest; +import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult; import com.amazonaws.services.ec2.model.DescribeImagesRequest; import com.amazonaws.services.ec2.model.DescribeInstancesRequest; import com.amazonaws.services.ec2.model.DescribeInstancesResult; import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest; import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; import com.amazonaws.services.ec2.model.DescribeSpotInstanceRequestsRequest; +import com.amazonaws.services.ec2.model.DescribeSpotPriceHistoryRequest; +import com.amazonaws.services.ec2.model.DescribeSpotPriceHistoryResult; import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; import com.amazonaws.services.ec2.model.DescribeSubnetsResult; import com.amazonaws.services.ec2.model.Filter; @@ -57,6 +61,7 @@ import com.amazonaws.services.ec2.model.SpotInstanceRequest; import com.amazonaws.services.ec2.model.SpotMarketOptions; import com.amazonaws.services.ec2.model.SpotPlacement; +import com.amazonaws.services.ec2.model.SpotPrice; import com.amazonaws.services.ec2.model.StartInstancesRequest; import com.amazonaws.services.ec2.model.StartInstancesResult; import com.amazonaws.services.ec2.model.Subnet; @@ -121,11 +126,92 @@ import java.util.stream.Stream; import javax.annotation.CheckForNull; +import javax.servlet.ServletException; +import hudson.plugins.ec2.util.AmazonEC2Factory; +import hudson.plugins.ec2.util.DeviceMappingParser; +import hudson.plugins.ec2.util.EC2AgentConfig; +import hudson.plugins.ec2.util.EC2AgentFactory; +import hudson.plugins.ec2.util.MinimumInstanceChecker; +import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig; import edu.umd.cs.findbugs.annotations.NonNull; +import hudson.XmlFile; +import hudson.model.listeners.SaveableListener; import hudson.security.Permission; +import hudson.util.Secret; +import jenkins.model.Jenkins; +import jenkins.model.JenkinsLocationConfiguration; +import jenkins.slaves.iterators.api.NodeIterator; + +import org.apache.commons.lang.StringUtils; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.DataBoundSetter; +import org.kohsuke.stapler.QueryParameter; +import com.amazonaws.AmazonClientException; +import com.amazonaws.AmazonServiceException; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.services.ec2.AmazonEC2; +import com.amazonaws.services.ec2.model.AmazonEC2Exception; +import com.amazonaws.services.ec2.model.BlockDeviceMapping; +import com.amazonaws.services.ec2.model.CancelSpotInstanceRequestsRequest; +import com.amazonaws.services.ec2.model.CreateTagsRequest; +import com.amazonaws.services.ec2.model.CreditSpecificationRequest; +import com.amazonaws.services.ec2.model.DescribeImagesRequest; +import com.amazonaws.services.ec2.model.DescribeInstancesRequest; +import com.amazonaws.services.ec2.model.DescribeInstancesResult; +import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest; +import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; +import com.amazonaws.services.ec2.model.DescribeSpotInstanceRequestsRequest; +import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; +import com.amazonaws.services.ec2.model.DescribeSubnetsResult; +import com.amazonaws.services.ec2.model.Filter; +import com.amazonaws.services.ec2.model.IamInstanceProfileSpecification; +import com.amazonaws.services.ec2.model.Image; +import com.amazonaws.services.ec2.model.Instance; +import com.amazonaws.services.ec2.model.InstanceMarketOptionsRequest; +import com.amazonaws.services.ec2.model.InstanceNetworkInterfaceSpecification; +import com.amazonaws.services.ec2.model.InstanceStateName; +import com.amazonaws.services.ec2.model.InstanceType; +import com.amazonaws.services.ec2.model.KeyPair; +import com.amazonaws.services.ec2.model.LaunchSpecification; +import com.amazonaws.services.ec2.model.MarketType; +import com.amazonaws.services.ec2.model.Placement; +import com.amazonaws.services.ec2.model.RequestSpotInstancesRequest; +import com.amazonaws.services.ec2.model.RequestSpotInstancesResult; +import com.amazonaws.services.ec2.model.Reservation; +import com.amazonaws.services.ec2.model.ResourceType; +import com.amazonaws.services.ec2.model.RunInstancesRequest; +import com.amazonaws.services.ec2.model.SecurityGroup; +import com.amazonaws.services.ec2.model.ShutdownBehavior; +import com.amazonaws.services.ec2.model.SpotInstanceRequest; +import com.amazonaws.services.ec2.model.SpotMarketOptions; +import com.amazonaws.services.ec2.model.SpotPlacement; +import com.amazonaws.services.ec2.model.StartInstancesRequest; +import com.amazonaws.services.ec2.model.StartInstancesResult; +import com.amazonaws.services.ec2.model.Subnet; +import com.amazonaws.services.ec2.model.Tag; +import com.amazonaws.services.ec2.model.TagSpecification; + +import hudson.Extension; +import hudson.Util; +import hudson.model.Describable; +import hudson.model.Descriptor; +import hudson.model.Descriptor.FormException; +import hudson.model.Hudson; +import hudson.model.Label; +import hudson.model.Node; +import hudson.model.Saveable; +import hudson.model.TaskListener; +import hudson.model.labels.LabelAtom; +import hudson.slaves.NodeProperty; +import hudson.slaves.NodePropertyDescriptor; +import hudson.util.DescribableList; +import hudson.util.FormValidation; +import hudson.util.ListBoxModel; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.interceptor.RequirePOST; From b2a38e00eebb3a0609a44860436870ba7a77993e Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Mon, 7 Sep 2020 13:44:00 +0530 Subject: [PATCH 12/26] fixing padding --- .../hudson/plugins/ec2/SlaveTemplate.java | 148 +++++++++--------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index cac34fcad..49074cad1 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -336,14 +336,14 @@ public class SlaveTemplate implements Describable { @DataBoundConstructor public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, - List> nodeProperties, HostKeyVerificationStrategyEnum hostKeyVerificationStrategy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, + List> nodeProperties, HostKeyVerificationStrategyEnum hostKeyVerificationStrategy) { if(StringUtils.isNotBlank(remoteAdmin) || StringUtils.isNotBlank(jvmopts) || StringUtils.isNotBlank(tmpDir)){ LOGGER.log(Level.FINE, "As remoteAdmin, jvmopts or tmpDir is not blank, we must ensure the user has ADMINISTER rights."); // Can be null during tests @@ -414,14 +414,14 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, - List> nodeProperties) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, + List> nodeProperties) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, @@ -435,14 +435,14 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, - List> nodeProperties) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, + List> nodeProperties) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, @@ -456,13 +456,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses,List> nodeProperties ) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses,List> nodeProperties ) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, @@ -472,13 +472,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, @@ -488,13 +488,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, @@ -504,13 +504,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, boolean monitoring, - boolean t2Unlimited) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, boolean monitoring, + boolean t2Unlimited) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, @@ -519,12 +519,12 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, @@ -533,12 +533,12 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, - boolean connectBySSHProcess) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, + boolean connectBySSHProcess) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, false, useEphemeralDevices, @@ -546,11 +546,11 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, useEphemeralDevices, @@ -561,11 +561,11 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri * Backward compatible constructor for reloading previous version data */ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, - String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, - String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - String launchTimeoutStr) { + String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, + String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, + String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + String launchTimeoutStr) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, new UnixData(rootCommandPrefix, slaveCommandPrefix, slaveCommandSuffix, sshPort), jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, From 1e974f002e64cc7b7d2450662604215bfb212058 Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Mon, 7 Sep 2020 13:46:05 +0530 Subject: [PATCH 13/26] fixing padding --- .../java/hudson/plugins/ec2/SlaveTemplate.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index 49074cad1..2f31c048d 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -336,14 +336,14 @@ public class SlaveTemplate implements Describable { @DataBoundConstructor public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, - List> nodeProperties, HostKeyVerificationStrategyEnum hostKeyVerificationStrategy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, + List> nodeProperties, HostKeyVerificationStrategyEnum hostKeyVerificationStrategy) { if(StringUtils.isNotBlank(remoteAdmin) || StringUtils.isNotBlank(jvmopts) || StringUtils.isNotBlank(tmpDir)){ LOGGER.log(Level.FINE, "As remoteAdmin, jvmopts or tmpDir is not blank, we must ensure the user has ADMINISTER rights."); // Can be null during tests From 3105e565735c729318abcfc7ab8aa13b3b13378f Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Mon, 7 Sep 2020 13:46:52 +0530 Subject: [PATCH 14/26] fixing padding --- .../java/hudson/plugins/ec2/SlaveTemplate.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index 2f31c048d..7594ddb19 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -488,13 +488,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, From 176ea49e3028e7500916e57d7b8da09b2e928adc Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Mon, 7 Sep 2020 13:47:49 +0530 Subject: [PATCH 15/26] fixing padding --- src/main/java/hudson/plugins/ec2/SlaveTemplate.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index 7594ddb19..7fdcf8791 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -496,10 +496,10 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, - tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, - idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, - monitoring, t2Unlimited, connectionStrategy, maxTotalUses); + tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, + idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + monitoring, t2Unlimited, connectionStrategy, maxTotalUses); } @Deprecated From 035c74720f41ecf0a5c9a87716d22434cba27d98 Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Tue, 5 Jan 2021 01:16:30 +0530 Subject: [PATCH 16/26] Adding Tenancy attribute as drop down --- README.md | 8 +- .../hudson/plugins/ec2/EC2AbstractSlave.java | 351 +++++++++--------- .../hudson/plugins/ec2/EC2OndemandSlave.java | 22 +- .../java/hudson/plugins/ec2/EC2SpotSlave.java | 2 +- .../hudson/plugins/ec2/SlaveTemplate.java | 194 ++++------ .../plugins/ec2/util/EC2AgentConfig.java | 27 +- .../plugins/ec2/util/EC2AgentFactoryImpl.java | 2 +- .../plugins/ec2/EC2Computer/configure.jelly | 8 +- .../plugins/ec2/SlaveTemplate/config.jelly | 12 +- ...-useHostTenancy.html => help-tenancy.html} | 6 +- .../help-useDedicatedTenancy.html | 30 -- .../plugins/ec2/EC2AbstractSlaveTest.java | 6 +- .../plugins/ec2/EC2OndemandSlaveTest.java | 4 +- .../plugins/ec2/EC2RetentionStrategyTest.java | 26 +- .../plugins/ec2/EC2SlaveMonitorTest.java | 4 +- .../hudson/plugins/ec2/SlaveTemplateTest.java | 90 ++--- .../plugins/ec2/SlaveTemplateUnitTest.java | 4 +- .../plugins/ec2/TemplateLabelsTest.java | 2 +- .../SshHostKeyVerificationStrategyTest.java | 4 +- .../ec2/util/EC2AgentFactoryMockImpl.java | 9 +- .../hudson/plugins/ec2/UnixDataExport.yml | 3 +- 21 files changed, 350 insertions(+), 464 deletions(-) rename src/main/resources/hudson/plugins/ec2/SlaveTemplate/{help-useHostTenancy.html => help-tenancy.html} (79%) delete mode 100644 src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-useDedicatedTenancy.html diff --git a/README.md b/README.md index 08f2abab3..dfbcd313c 100644 --- a/README.md +++ b/README.md @@ -321,8 +321,7 @@ def SlaveTemplateUsEast1Parameters = [ tags: new EC2Tag('Name', 'jenkins-slave'), tmpDir: '', type: 't2.medium', - useDedicatedTenancy: false, - useHostTenancy: false, + tenancy: 'Default', useEphemeralDevices: true, usePrivateDnsName: true, userData: '', @@ -408,13 +407,12 @@ SlaveTemplate slaveTemplateUsEast1 = new SlaveTemplate( SlaveTemplateUsEast1Parameters.iamInstanceProfile, SlaveTemplateUsEast1Parameters.deleteRootOnTermination, SlaveTemplateUsEast1Parameters.useEphemeralDevices, - SlaveTemplateUsEast1Parameters.useDedicatedTenancy, - SlaveTemplateUsEast1Parameters.useHostTenancy, SlaveTemplateUsEast1Parameters.launchTimeoutStr, SlaveTemplateUsEast1Parameters.associatePublicIp, SlaveTemplateUsEast1Parameters.customDeviceMapping, SlaveTemplateUsEast1Parameters.connectBySSHProcess, - SlaveTemplateUsEast1Parameters.connectUsingPublicIp + SlaveTemplateUsEast1Parameters.connectUsingPublicIp, + SlaveTemplateUsEast1Parameters.tenancy, ) // https://javadoc.jenkins.io/plugin/ec2/index.html?hudson/plugins/ec2/AmazonEC2Cloud.html diff --git a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java index 75d779ec5..bfee63f15 100644 --- a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java @@ -23,6 +23,7 @@ */ package hudson.plugins.ec2; +import com.amazonaws.services.ec2.model.*; import hudson.Util; import hudson.model.Computer; import hudson.model.Descriptor; @@ -57,17 +58,6 @@ import com.amazonaws.AmazonClientException; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.services.ec2.AmazonEC2; -import com.amazonaws.services.ec2.model.AvailabilityZone; -import com.amazonaws.services.ec2.model.CreateTagsRequest; -import com.amazonaws.services.ec2.model.DeleteTagsRequest; -import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult; -import com.amazonaws.services.ec2.model.Instance; -import com.amazonaws.services.ec2.model.InstanceBlockDeviceMapping; -import com.amazonaws.services.ec2.model.InstanceStateName; -import com.amazonaws.services.ec2.model.InstanceType; -import com.amazonaws.services.ec2.model.StopInstancesRequest; -import com.amazonaws.services.ec2.model.Tag; -import com.amazonaws.services.ec2.model.TerminateInstancesRequest; /** * Slave running on EC2. @@ -92,8 +82,6 @@ public abstract class EC2AbstractSlave extends Slave { public final String jvmopts; // e.g. -Xmx1g public final boolean stopOnTerminate; public final String idleTerminationMinutes; - public final boolean useDedicatedTenancy; - public final boolean useHostTenancy; public boolean isConnected = false; public List tags; public final String cloudName; @@ -141,7 +129,9 @@ public abstract class EC2AbstractSlave extends Slave { public static final String TEST_ZONE = "testZone"; - public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) + public final Tenancy tenancy; + + public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) throws FormException, IOException { super(name, remoteFS, launcher); @@ -161,20 +151,19 @@ public EC2AbstractSlave(String name, String instanceId, String templateDescripti this.idleTerminationMinutes = idleTerminationMinutes; this.tags = tags; this.usePrivateDnsName = connectionStrategy == ConnectionStrategy.PRIVATE_DNS; - this.useDedicatedTenancy = useDedicatedTenancy; - this.useHostTenancy = useHostTenancy; this.cloudName = cloudName; this.launchTimeout = launchTimeout; this.amiType = amiType; this.maxTotalUses = maxTotalUses; + this.tenancy = tenancy == null ? Tenancy.Default : tenancy; readResolve(); fetchLiveInstanceData(true); } @Deprecated - public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType) + public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean usePrivateDnsName, int launchTimeout, AMITypeData amiType, Tenancy tenancy) throws FormException, IOException { - this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); + this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1, tenancy); } @Override @@ -203,7 +192,7 @@ protected Object readResolve() { } } } - + /* * If this field is null (as it would be if this object is deserialized and not constructed normally) then * we need to explicitly initialize it, otherwise we will cause major blocker issues such as this one which @@ -226,168 +215,168 @@ public EC2Cloud getCloud() { */ /* package */static int toNumExecutors(InstanceType it) { switch (it) { - case T1Micro: - return 1; - case M1Small: - return 1; - case M1Medium: - return 2; - case M3Medium: - return 2; - case T3Nano: - return 2; - case T3aNano: - return 2; - case T3Micro: - return 2; - case T3aMicro: - return 2; - case T3Small: - return 2; - case T3aSmall: - return 2; - case T3Medium: - return 2; - case T3aMedium: - return 2; - case A1Large: - return 2; - case T3Large: - return 3; - case T3aLarge: - return 3; - case M1Large: - return 4; - case M3Large: - return 4; - case M4Large: - return 4; - case M5Large: - return 4; - case M5aLarge: - return 4; - case T3Xlarge: - return 5; - case T3aXlarge: - return 5; - case A1Xlarge: - return 5; - case C1Medium: - return 5; - case M2Xlarge: - return 6; - case C3Large: - return 7; - case C4Large: - return 7; - case C5Large: - return 7; - case C5dLarge: - return 7; - case M1Xlarge: - return 8; - case T32xlarge: - return 10; - case T3a2xlarge: - return 10; - case A12xlarge: - return 10; - case M22xlarge: - return 13; - case M3Xlarge: - return 13; - case M4Xlarge: - return 13; - case M5Xlarge: - return 13; - case M5aXlarge: - return 13; - case A14xlarge: - return 14; - case C3Xlarge: - return 14; - case C4Xlarge: - return 14; - case C5Xlarge: - return 14; - case C5dXlarge: - return 14; - case C1Xlarge: - return 20; - case M24xlarge: - return 26; - case M32xlarge: - return 26; - case M42xlarge: - return 26; - case M52xlarge: - return 26; - case M5a2xlarge: - return 26; - case G22xlarge: - return 26; - case C32xlarge: - return 28; - case C42xlarge: - return 28; - case C52xlarge: - return 28; - case C5d2xlarge: - return 28; - case Cc14xlarge: - return 33; - case Cg14xlarge: - return 33; - case Hi14xlarge: - return 35; - case Hs18xlarge: - return 35; - case C34xlarge: - return 55; - case C44xlarge: - return 55; - case C54xlarge: - return 55; - case C5d4xlarge: - return 55; - case M44xlarge: - return 55; - case M54xlarge: - return 55; - case M5a4xlarge: - return 55; - case Cc28xlarge: - return 88; - case Cr18xlarge: - return 88; - case C38xlarge: - return 108; - case C48xlarge: - return 108; - case C59xlarge: - return 108; - case C5d9xlarge: - return 108; - case M410xlarge: - return 120; - case M512xlarge: - return 120; - case M5a12xlarge: - return 120; - case M416xlarge: - return 160; - case C518xlarge: - return 216; - case C5d18xlarge: - return 216; - case M524xlarge: - return 240; - case M5a24xlarge: - return 240; + case T1Micro: + return 1; + case M1Small: + return 1; + case M1Medium: + return 2; + case M3Medium: + return 2; + case T3Nano: + return 2; + case T3aNano: + return 2; + case T3Micro: + return 2; + case T3aMicro: + return 2; + case T3Small: + return 2; + case T3aSmall: + return 2; + case T3Medium: + return 2; + case T3aMedium: + return 2; + case A1Large: + return 2; + case T3Large: + return 3; + case T3aLarge: + return 3; + case M1Large: + return 4; + case M3Large: + return 4; + case M4Large: + return 4; + case M5Large: + return 4; + case M5aLarge: + return 4; + case T3Xlarge: + return 5; + case T3aXlarge: + return 5; + case A1Xlarge: + return 5; + case C1Medium: + return 5; + case M2Xlarge: + return 6; + case C3Large: + return 7; + case C4Large: + return 7; + case C5Large: + return 7; + case C5dLarge: + return 7; + case M1Xlarge: + return 8; + case T32xlarge: + return 10; + case T3a2xlarge: + return 10; + case A12xlarge: + return 10; + case M22xlarge: + return 13; + case M3Xlarge: + return 13; + case M4Xlarge: + return 13; + case M5Xlarge: + return 13; + case M5aXlarge: + return 13; + case A14xlarge: + return 14; + case C3Xlarge: + return 14; + case C4Xlarge: + return 14; + case C5Xlarge: + return 14; + case C5dXlarge: + return 14; + case C1Xlarge: + return 20; + case M24xlarge: + return 26; + case M32xlarge: + return 26; + case M42xlarge: + return 26; + case M52xlarge: + return 26; + case M5a2xlarge: + return 26; + case G22xlarge: + return 26; + case C32xlarge: + return 28; + case C42xlarge: + return 28; + case C52xlarge: + return 28; + case C5d2xlarge: + return 28; + case Cc14xlarge: + return 33; + case Cg14xlarge: + return 33; + case Hi14xlarge: + return 35; + case Hs18xlarge: + return 35; + case C34xlarge: + return 55; + case C44xlarge: + return 55; + case C54xlarge: + return 55; + case C5d4xlarge: + return 55; + case M44xlarge: + return 55; + case M54xlarge: + return 55; + case M5a4xlarge: + return 55; + case Cc28xlarge: + return 88; + case Cr18xlarge: + return 88; + case C38xlarge: + return 108; + case C48xlarge: + return 108; + case C59xlarge: + return 108; + case C5d9xlarge: + return 108; + case M410xlarge: + return 120; + case M512xlarge: + return 120; + case M5a12xlarge: + return 120; + case M416xlarge: + return 160; + case C518xlarge: + return 216; + case C5d18xlarge: + return 216; + case M524xlarge: + return 240; + case M5a24xlarge: + return 240; // We don't have a suggestion, but we don't want to fail completely // surely? - default: - return 1; + default: + return 1; } } @@ -737,7 +726,7 @@ public int getBootDelay() { public boolean isSpecifyPassword() { return amiType.isWindows() && ((WindowsData) amiType).isSpecifyPassword(); } - + public boolean isAllowSelfSignedCertificate() { return amiType.isWindows() && ((WindowsData) amiType).isAllowSelfSignedCertificate(); } @@ -786,4 +775,4 @@ public List> getAMITypeDescriptors() { } } -} +} \ No newline at end of file diff --git a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java index 7893d3dbd..20781d965 100644 --- a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java @@ -36,43 +36,39 @@ public class EC2OndemandSlave extends EC2AbstractSlave { @Deprecated public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, launchTimeout, amiType); + this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, launchTimeout, amiType, Tenancy.Default); } @Deprecated - public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) + public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, int launchTimeout, AMITypeData amiType, Tenancy tenancy) throws FormException, IOException { - this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, useDedicatedTenancy, launchTimeout, amiType); + this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, launchTimeout, amiType, tenancy); } @Deprecated - public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) + public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean usePrivateDnsName, int launchTimeout, AMITypeData amiType, Tenancy tenancy) throws FormException, IOException { - this(templateDescription + " (" + instanceId + ")", instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, Collections.emptyList(), remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, false, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); - } - @Deprecated - public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType) - throws FormException, IOException { - this(templateDescription + " (" + instanceId + ")", instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, Collections.emptyList(), remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); + this(templateDescription + " (" + instanceId + ")", instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, Collections.emptyList(), remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1,tenancy ); } @DataBoundConstructor - public EC2OndemandSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean useDedicatedTenancy, boolean useHostTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) + public EC2OndemandSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) throws FormException, IOException { super(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, amiType.isWindows() ? new EC2WindowsLauncher() - : new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, useHostTenancy, launchTimeout, amiType, connectionStrategy, maxTotalUses); + : new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, tenancy); this.publicDNS = publicDNS; this.privateDNS = privateDNS; } + /** * Constructor for debugging. */ public EC2OndemandSlave(String instanceId) throws FormException, IOException { - this(instanceId, instanceId, "debug", "/tmp/hudson", 1, "debug", Mode.NORMAL, "", "/tmp", Collections.emptyList(), null, null, false, null, "Fake public", "Fake private", null, null, false, false, 0, new UnixData(null, null, null, null), ConnectionStrategy.PRIVATE_IP, -1); + this(instanceId, instanceId, "debug", "/tmp/hudson", 1, "debug", Mode.NORMAL, "", "/tmp", Collections.emptyList(), null, null, false, null, "Fake public", "Fake private", null, null, 0, new UnixData(null, null, null, null), ConnectionStrategy.PRIVATE_IP, -1, Tenancy.Default); } /** diff --git a/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java b/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java index c98dfbc47..fac3afd12 100644 --- a/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2SpotSlave.java @@ -51,7 +51,7 @@ public EC2SpotSlave(String name, String spotInstanceRequestId, String templateDe throws FormException, IOException { super(name, "", templateDescription, remoteFS, numExecutors, mode, labelString, amiType.isWindows() ? new EC2WindowsLauncher() : - new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, false, idleTerminationMinutes, tags, cloudName, false, false, launchTimeout, amiType, connectionStrategy, maxTotalUses); + new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, false, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses,null); this.name = name; this.spotInstanceRequestId = spotInstanceRequestId; diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index 7fdcf8791..28b7f633e 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -22,51 +22,7 @@ import com.amazonaws.AmazonServiceException; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.services.ec2.AmazonEC2; -import com.amazonaws.services.ec2.model.AmazonEC2Exception; -import com.amazonaws.services.ec2.model.AvailabilityZone; -import com.amazonaws.services.ec2.model.BlockDeviceMapping; -import com.amazonaws.services.ec2.model.CancelSpotInstanceRequestsRequest; -import com.amazonaws.services.ec2.model.CreateTagsRequest; -import com.amazonaws.services.ec2.model.CreditSpecificationRequest; -import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult; -import com.amazonaws.services.ec2.model.DescribeImagesRequest; -import com.amazonaws.services.ec2.model.DescribeInstancesRequest; -import com.amazonaws.services.ec2.model.DescribeInstancesResult; -import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest; -import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; -import com.amazonaws.services.ec2.model.DescribeSpotInstanceRequestsRequest; -import com.amazonaws.services.ec2.model.DescribeSpotPriceHistoryRequest; -import com.amazonaws.services.ec2.model.DescribeSpotPriceHistoryResult; -import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; -import com.amazonaws.services.ec2.model.DescribeSubnetsResult; -import com.amazonaws.services.ec2.model.Filter; -import com.amazonaws.services.ec2.model.IamInstanceProfileSpecification; -import com.amazonaws.services.ec2.model.Image; -import com.amazonaws.services.ec2.model.Instance; -import com.amazonaws.services.ec2.model.InstanceMarketOptionsRequest; -import com.amazonaws.services.ec2.model.InstanceNetworkInterfaceSpecification; -import com.amazonaws.services.ec2.model.InstanceStateName; -import com.amazonaws.services.ec2.model.InstanceType; -import com.amazonaws.services.ec2.model.KeyPair; -import com.amazonaws.services.ec2.model.LaunchSpecification; -import com.amazonaws.services.ec2.model.MarketType; -import com.amazonaws.services.ec2.model.Placement; -import com.amazonaws.services.ec2.model.RequestSpotInstancesRequest; -import com.amazonaws.services.ec2.model.RequestSpotInstancesResult; -import com.amazonaws.services.ec2.model.Reservation; -import com.amazonaws.services.ec2.model.ResourceType; -import com.amazonaws.services.ec2.model.RunInstancesRequest; -import com.amazonaws.services.ec2.model.SecurityGroup; -import com.amazonaws.services.ec2.model.ShutdownBehavior; -import com.amazonaws.services.ec2.model.SpotInstanceRequest; -import com.amazonaws.services.ec2.model.SpotMarketOptions; -import com.amazonaws.services.ec2.model.SpotPlacement; -import com.amazonaws.services.ec2.model.SpotPrice; -import com.amazonaws.services.ec2.model.StartInstancesRequest; -import com.amazonaws.services.ec2.model.StartInstancesResult; -import com.amazonaws.services.ec2.model.Subnet; -import com.amazonaws.services.ec2.model.Tag; -import com.amazonaws.services.ec2.model.TagSpecification; +import com.amazonaws.services.ec2.model.*; import hudson.Extension; import hudson.Util; import hudson.XmlFile; @@ -291,10 +247,6 @@ public class SlaveTemplate implements Describable { protected transient EC2Cloud parent; - public final boolean useDedicatedTenancy; - - private boolean useHostTenancy; - public AMITypeData amiType; public int launchTimeout; @@ -334,16 +286,18 @@ public class SlaveTemplate implements Describable { @Deprecated public boolean connectUsingPublicIp; + public final Tenancy tenancy; + @DataBoundConstructor public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, - List> nodeProperties, HostKeyVerificationStrategyEnum hostKeyVerificationStrategy) { + List> nodeProperties, HostKeyVerificationStrategyEnum hostKeyVerificationStrategy, Tenancy tenancy) { if(StringUtils.isNotBlank(remoteAdmin) || StringUtils.isNotBlank(jvmopts) || StringUtils.isNotBlank(tmpDir)){ LOGGER.log(Level.FINE, "As remoteAdmin, jvmopts or tmpDir is not blank, we must ensure the user has ADMINISTER rights."); // Can be null during tests @@ -375,8 +329,6 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri this.idleTerminationMinutes = idleTerminationMinutes; this.associatePublicIp = associatePublicIp; this.connectionStrategy = connectionStrategy == null ? ConnectionStrategy.PRIVATE_IP : connectionStrategy; - this.useDedicatedTenancy = useDedicatedTenancy; - this.useHostTenancy = useHostTenancy; this.connectBySSHProcess = connectBySSHProcess; this.maxTotalUses = maxTotalUses; this.nodeProperties = new DescribableList<>(Saveable.NOOP, Util.fixNull(nodeProperties)); @@ -408,29 +360,30 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri this.t2Unlimited = t2Unlimited; this.hostKeyVerificationStrategy = hostKeyVerificationStrategy != null ? hostKeyVerificationStrategy : HostKeyVerificationStrategyEnum.CHECK_NEW_SOFT; + this.tenancy = tenancy == null ? Tenancy.Default : tenancy; readResolve(); // initialize } @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, boolean useHostTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, - List> nodeProperties) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, + List> nodeProperties, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, minimumNumberOfSpareInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, useDedicatedTenancy, useHostTenancy ,launchTimeoutStr, associatePublicIp, + useEphemeralDevices,launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, - nodeProperties, null); + nodeProperties, null,tenancy); } @Deprecated @@ -439,7 +392,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, List> nodeProperties) { @@ -448,10 +401,10 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, minimumNumberOfSpareInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, useDedicatedTenancy, false,launchTimeoutStr, associatePublicIp, + useEphemeralDevices, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, - nodeProperties, null); + nodeProperties,null); } @Deprecated @@ -460,14 +413,14 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses,List> nodeProperties ) { + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses,List> nodeProperties , Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, - connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, nodeProperties); + useEphemeralDevices, launchTimeoutStr, associatePublicIp, customDeviceMapping, + connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, nodeProperties, tenancy); } @Deprecated @@ -476,14 +429,14 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, - connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, Collections.emptyList()); + useEphemeralDevices, launchTimeoutStr, associatePublicIp, customDeviceMapping, + connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, Collections.emptyList(), tenancy); } @Deprecated @@ -492,14 +445,14 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, - monitoring, t2Unlimited, connectionStrategy, maxTotalUses); + launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + monitoring, t2Unlimited, connectionStrategy, maxTotalUses, tenancy); } @Deprecated @@ -508,14 +461,14 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, boolean monitoring, - boolean t2Unlimited) { + boolean t2Unlimited, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, - monitoring, t2Unlimited, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, connectUsingPublicIp, associatePublicIp), -1); + launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + monitoring, t2Unlimited, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, connectUsingPublicIp, associatePublicIp), -1, tenancy); } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, @@ -523,13 +476,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp) { + boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, - connectUsingPublicIp, false, false); + launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + connectUsingPublicIp, false, false, tenancy); } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, @@ -537,39 +490,39 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, - boolean connectBySSHProcess) { + String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, + boolean connectBySSHProcess, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, false, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, false); + launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, false, tenancy); } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, + String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, useEphemeralDevices, - useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, false); + launchTimeoutStr, associatePublicIp, customDeviceMapping, false, tenancy); } /** * Backward compatible constructor for reloading previous version data */ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, - String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, - String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - String launchTimeoutStr) { + String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, + String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, + String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + String launchTimeoutStr, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, new UnixData(rootCommandPrefix, slaveCommandPrefix, slaveCommandSuffix, sshPort), jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, - useEphemeralDevices, false, launchTimeoutStr, false, null); + useEphemeralDevices, launchTimeoutStr, false,null,false,tenancy); } @@ -724,14 +677,6 @@ public String getidleTerminationMinutes() { return idleTerminationMinutes; } - public boolean getUseDedicatedTenancy() { - return useDedicatedTenancy; - } - - public boolean getUseHostTenancy() { - return useHostTenancy; - } - public Set getLabelSet() { return labelSet; } @@ -834,6 +779,10 @@ public DescribableList, NodePropertyDescriptor> getNodePropertie return Objects.requireNonNull(nodeProperties); } + public Tenancy getTenancyAttribute() { + return tenancy; + } + public enum ProvisionOptions { ALLOW_CREATE, FORCE_CREATE } /** @@ -925,21 +874,25 @@ HashMap> makeRunInstancesRequestAndFilters(int riRequest.setKeyName(keyPair.getKeyName()); diFilters.add(new Filter("key-name").withValues(keyPair.getKeyName())); - if (StringUtils.isNotBlank(getZone())) { Placement placement = new Placement(getZone()); - if (getUseDedicatedTenancy()) { + if (getTenancyAttribute().equals(Tenancy.Dedicated)) { placement.setTenancy("dedicated"); } riRequest.setPlacement(placement); diFilters.add(new Filter("availability-zone").withValues(getZone())); } - if (getUseHostTenancy()) { + if(getTenancyAttribute().equals(Tenancy.Host)){ Placement placement = new Placement(); placement.setTenancy("host"); riRequest.setPlacement(placement); diFilters.add(new Filter("tenancy").withValues(placement.getTenancy())); + }else if(getTenancyAttribute().equals(Tenancy.Default)){ + Placement placement = new Placement(); + placement.setTenancy("default"); + riRequest.setPlacement(placement); + diFilters.add(new Filter("tenancy").withValues(placement.getTenancy())); } String subnetId = chooseSubnetId(rotateSubnet); @@ -1446,12 +1399,11 @@ protected EC2OndemandSlave newOndemandSlave(Instance inst) throws FormException, .withPrivateDNS(inst.getPrivateDnsName()) .withTags(EC2Tag.fromAmazonTags(inst.getTags())) .withCloudName(parent.name) - .withUseDedicatedTenancy(useDedicatedTenancy) - .withUseHostTenancy(useHostTenancy) .withLaunchTimeout(getLaunchTimeout()) .withAmiType(amiType) .withConnectionStrategy(connectionStrategy) .withMaxTotalUses(maxTotalUses) + .withTenancyAttribute(tenancy) .build(); return EC2AgentFactory.getInstance().createOnDemandAgent(config); } @@ -2025,5 +1977,23 @@ public FormValidation doCheckHostKeyVerificationStrategy(@QueryParameter String Optional okResult = matched.map(s -> FormValidation.ok()); return okResult.orElse(FormValidation.error(String.format("Could not find selected host key verification (%s)", hostKeyVerificationStrategy))); } + + public String getDefaultTenancy() { + // new templates default to the most secure strategy + return Tenancy.Default.name(); + } + + public ListBoxModel doFillTenancyItems(@QueryParameter String tenancy) { + return Stream.of(Tenancy.values()) + .map(v -> { + if (v.name().equals(tenancy)) { + return new ListBoxModel.Option(v.name(), v.name(), true); + } else { + return new ListBoxModel.Option(v.name(), v.name(), false); + } + }) + .collect(Collectors.toCollection(ListBoxModel::new)); + } + } } diff --git a/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java b/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java index 7b6ad5c51..0e4febbef 100644 --- a/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java +++ b/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java @@ -1,5 +1,6 @@ package hudson.plugins.ec2.util; +import com.amazonaws.services.ec2.model.Tenancy; import hudson.model.Node; import hudson.plugins.ec2.AMITypeData; import hudson.plugins.ec2.ConnectionStrategy; @@ -56,8 +57,7 @@ public static class OnDemand extends EC2AgentConfig { final boolean stopOnTerminate; final String publicDNS; final String privateDNS; - final boolean useDedicatedTenancy; - final boolean useHostTenancy; + final Tenancy tenancy; private OnDemand(OnDemandBuilder builder) { super(builder); @@ -65,8 +65,7 @@ private OnDemand(OnDemandBuilder builder) { this.stopOnTerminate = builder.isStopOnTerminate(); this.publicDNS = builder.getPublicDNS(); this.privateDNS = builder.getPrivateDNS(); - this.useDedicatedTenancy = builder.isUseDedicatedTenancy(); - this.useHostTenancy = builder.isUseHostTenancy(); + this.tenancy = builder.getTenancyAttribute(); } } @@ -206,8 +205,7 @@ public static class OnDemandBuilder extends Builder { private boolean stopOnTerminate; private String publicDNS; private String privateDNS; - private boolean useDedicatedTenancy; - private boolean useHostTenancy; + private Tenancy tenancy; public OnDemandBuilder withInstanceId(String instanceId) { this.instanceId = instanceId; @@ -245,23 +243,12 @@ public String getPrivateDNS() { return privateDNS; } - public OnDemandBuilder withUseDedicatedTenancy(boolean useDedicatedTenancy) { - this.useDedicatedTenancy = useDedicatedTenancy; + public OnDemandBuilder withTenancyAttribute( Tenancy tenancy){ + this.tenancy = tenancy; return this; } - public boolean isUseDedicatedTenancy() { - return useDedicatedTenancy; - } - - public OnDemandBuilder withUseHostTenancy(boolean useHostTenancy) { - this.useHostTenancy = useHostTenancy; - return this; - } - - public boolean isUseHostTenancy() { - return useHostTenancy; - } + public Tenancy getTenancyAttribute(){ return tenancy;} @Override protected OnDemandBuilder self() { diff --git a/src/main/java/hudson/plugins/ec2/util/EC2AgentFactoryImpl.java b/src/main/java/hudson/plugins/ec2/util/EC2AgentFactoryImpl.java index 16bdd2458..d5eb9280c 100644 --- a/src/main/java/hudson/plugins/ec2/util/EC2AgentFactoryImpl.java +++ b/src/main/java/hudson/plugins/ec2/util/EC2AgentFactoryImpl.java @@ -12,7 +12,7 @@ public class EC2AgentFactoryImpl implements EC2AgentFactory { @Override public EC2OndemandSlave createOnDemandAgent(EC2AgentConfig.OnDemand config) throws Descriptor.FormException, IOException { - return new EC2OndemandSlave(config.name, config.instanceId, config.description, config.remoteFS, config.numExecutors, config.labelString, config.mode, config.initScript, config.tmpDir, config.nodeProperties, config.remoteAdmin, config.jvmopts, config.stopOnTerminate, config.idleTerminationMinutes, config.publicDNS, config.privateDNS, config.tags, config.cloudName, config.useDedicatedTenancy, config.useHostTenancy, config.launchTimeout, config.amiType, config.connectionStrategy, config.maxTotalUses); + return new EC2OndemandSlave(config.name, config.instanceId, config.description, config.remoteFS, config.numExecutors, config.labelString, config.mode, config.initScript, config.tmpDir, config.nodeProperties, config.remoteAdmin, config.jvmopts, config.stopOnTerminate, config.idleTerminationMinutes, config.publicDNS, config.privateDNS, config.tags, config.cloudName, config.launchTimeout, config.amiType, config.connectionStrategy, config.maxTotalUses, config.tenancy); } @Override diff --git a/src/main/resources/hudson/plugins/ec2/EC2Computer/configure.jelly b/src/main/resources/hudson/plugins/ec2/EC2Computer/configure.jelly index f2a2c416b..da7982b49 100644 --- a/src/main/resources/hudson/plugins/ec2/EC2Computer/configure.jelly +++ b/src/main/resources/hudson/plugins/ec2/EC2Computer/configure.jelly @@ -116,12 +116,8 @@ THE SOFTWARE.
- - - - - - + + ${it.name()} diff --git a/src/main/resources/hudson/plugins/ec2/SlaveTemplate/config.jelly b/src/main/resources/hudson/plugins/ec2/SlaveTemplate/config.jelly index ddb291ea5..1149c0f48 100644 --- a/src/main/resources/hudson/plugins/ec2/SlaveTemplate/config.jelly +++ b/src/main/resources/hudson/plugins/ec2/SlaveTemplate/config.jelly @@ -114,14 +114,6 @@ THE SOFTWARE. - - - - - - - - @@ -192,6 +184,10 @@ THE SOFTWARE. + + ${it.name()} + + diff --git a/src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-useHostTenancy.html b/src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-tenancy.html similarity index 79% rename from src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-useHostTenancy.html rename to src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-tenancy.html index 426b77289..326ee8488 100644 --- a/src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-useHostTenancy.html +++ b/src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-tenancy.html @@ -22,9 +22,11 @@ THE SOFTWARE. -->
- Create instance using dedicated hardware instead of shared. Additional charges will apply, please see + Create instance using tenancy. Additional charges will apply, please see here: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html.

- This only applies for dedicated hosts which support host tenancy and this is an On-Demand + Dedicated Tenancy only applies if you have specified a VPC, Availability-Zone and this is an On-Demand Instance (not Spot Instance). +

+ Host Tenancy only applies if Your instance runs on a Dedicated Host, which is an isolated server with configurations that you can control.

\ No newline at end of file diff --git a/src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-useDedicatedTenancy.html b/src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-useDedicatedTenancy.html deleted file mode 100644 index 6539ab2aa..000000000 --- a/src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-useDedicatedTenancy.html +++ /dev/null @@ -1,30 +0,0 @@ - -
- Create instance using dedicated hardware instead of shared. Additional charges will apply, please see - here: http://aws.amazon.com/dedicated-instances/. -

- This only applies if you have specified a VPC, Availability-Zone and this is an On-Demand - Instance (not Spot Instance). -

\ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java index 5a69aa7df..6dc0abfa2 100644 --- a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java @@ -21,7 +21,7 @@ public class EC2AbstractSlaveTest { @Test public void testGetLaunchTimeoutInMillisShouldNotOverflow() throws Exception { - EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "cloud", false,false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, -1) { + EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "cloud", Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, -1,null) { @Override public void terminate() { // To change body of implemented methods use File | Settings | @@ -41,12 +41,12 @@ public String getEc2Type() { @Test public void testMaxUsesBackwardCompat() throws Exception { final String description = "description"; - SlaveTemplate orig = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1); + SlaveTemplate orig = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, null, "", true, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1,null); List templates = new ArrayList<>(); templates.add(orig); AmazonEC2Cloud ac = new AmazonEC2Cloud("us-east-1", false, "abc", "us-east-1", "ghi", "3", templates, null, null); r.jenkins.clouds.add(ac); - EC2AbstractSlave slave = new EC2AbstractSlave("name", "", description, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "ec2-us-east-1", false,false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, 0) { + EC2AbstractSlave slave = new EC2AbstractSlave("name", "", description, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "ec2-us-east-1", Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, 0,null) { @Override public void terminate() { } diff --git a/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java b/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java index 39d5d2725..d80838bea 100644 --- a/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java @@ -16,10 +16,10 @@ public class EC2OndemandSlaveTest { @Test public void testSpecifyMode() throws Exception { - EC2OndemandSlave slaveNormal = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.NORMAL, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", false, false, 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1); + EC2OndemandSlave slaveNormal = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.NORMAL, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1,null); assertEquals(Node.Mode.NORMAL, slaveNormal.getMode()); - EC2OndemandSlave slaveExclusive = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.EXCLUSIVE, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", false, false, 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1); + EC2OndemandSlave slaveExclusive = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.EXCLUSIVE, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1,null); assertEquals(Node.Mode.EXCLUSIVE, slaveExclusive.getMode()); } diff --git a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java index 875e06607..a37e9c19c 100644 --- a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java @@ -68,7 +68,7 @@ public void testOnBillingHourRetention() throws Exception { } private EC2Computer computerWithIdleTime(final int minutes, final int seconds) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false,false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { + final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1,null) { @Override public void terminate() { } @@ -107,7 +107,7 @@ public InstanceState getState() { @Override public SlaveTemplate getSlaveTemplate() { - return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); + return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null,false, null, "", false, "", false, "",null); } }; assertTrue(computer.isIdle()); @@ -147,7 +147,7 @@ public void testOnUsageCountRetention() throws Exception { } private EC2Computer computerWithUsageLimit(final int usageLimit) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false,false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, usageLimit) { + final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, usageLimit,null) { @Override public void terminate() { terminateCalled.set(true); @@ -208,8 +208,8 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", Collections .singletonList(template), "roleArn", "roleSessionName"); @@ -267,8 +267,8 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -323,8 +323,8 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -364,8 +364,8 @@ public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Excep public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidnight() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("15:00"); @@ -419,8 +419,8 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni public void testRetentionStopsAfterActiveRangeEnds() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); diff --git a/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java b/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java index a8def2cc7..a4f46b1f7 100644 --- a/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java @@ -29,7 +29,7 @@ public void init(){ @Test public void testMinimumNumberOfInstances() throws Exception { - SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0); + SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0,null); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", Collections.singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); @@ -45,7 +45,7 @@ public void testMinimumNumberOfSpareInstances() throws Exception { "tmpdir", "userdata", "10", "remoteadmin", null, "-Xmx1g", false, "subnet 456", null, "0", 0, 2, null, null, true, - true, false, "", false, + true, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0, null); diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java index cec320a7e..112ade7ca 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java @@ -49,16 +49,22 @@ import hudson.plugins.ec2.SlaveTemplate.ProvisionOptions; import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig; import com.amazonaws.services.ec2.model.Reservation; +import hudson.plugins.ec2.util.PrivateKeyHelper; import jenkins.model.Jenkins; import net.sf.json.JSONObject; +import org.apache.commons.math3.analysis.function.Power; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.runner.RunWith; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.mockito.ArgumentCaptor; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.modules.junit4.PowerMockRunner; import java.util.ArrayList; import java.util.Collections; @@ -92,7 +98,7 @@ public void testConfigRoundtrip() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null,false, null, "", true, "", false, "", null); List templates = new ArrayList(); templates.add(orig); @@ -102,31 +108,7 @@ public void testConfigRoundtrip() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); - } - - @Test - public void testConfigRoundtripWithHostTenancy() throws Exception { - String ami = "ami1"; - String description = "foo ami"; - - EC2Tag tag1 = new EC2Tag("name1", "value1"); - EC2Tag tag2 = new EC2Tag("name2", "value2"); - List tags = new ArrayList(); - tags.add(tag1); - tags.add(tag2); - - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null,0,0 ,"", "", false, false, false, true, "", false,"", false, false , false,ConnectionStrategy.PUBLIC_IP, -1,null); - - List templates = new ArrayList(); - templates.add(orig); - - AmazonEC2Cloud ac = new AmazonEC2Cloud("us-east-1", false, "abc", "us-east-1", "ghi", "3", templates, null, null); - r.jenkins.clouds.add(ac); - - r.submit(r.createWebClient().goTo("configure").getFormByName("config")); - SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,connectionStrategy,hostKeyVerificationStrategy,tenancy"); } @Test @@ -140,7 +122,7 @@ public void testConfigRoundtripWithCustomConnectionStrategy() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, "", "", false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1,null); List templates = new ArrayList(); templates.add(orig); @@ -150,7 +132,7 @@ public void testConfigRoundtripWithCustomConnectionStrategy() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,connectionStrategy,hostKeyVerificationStrategy,tenancy"); } @Test @@ -160,7 +142,7 @@ public void testDefaultSSHHostKeyVerificationStrategy() throws Exception { List tags = new ArrayList(); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null,null); List templates = new ArrayList(); templates.add(orig); @@ -170,7 +152,7 @@ public void testDefaultSSHHostKeyVerificationStrategy() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,connectionStrategy,hostKeyVerificationStrategy,tenancy"); // For already existing strategies, the default is this one assertEquals(HostKeyVerificationStrategyEnum.CHECK_NEW_SOFT, received.getHostKeyVerificationStrategy()); } @@ -189,7 +171,7 @@ public void testConfigRoundtripWithCustomSSHHostKeyVerificationStrategy() throws // We check this one is set final HostKeyVerificationStrategyEnum STRATEGY_TO_CHECK = HostKeyVerificationStrategyEnum.OFF; - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, false,"", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, STRATEGY_TO_CHECK); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, STRATEGY_TO_CHECK,null); List templates = new ArrayList(); templates.add(orig); @@ -199,7 +181,7 @@ public void testConfigRoundtripWithCustomSSHHostKeyVerificationStrategy() throws r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,connectionStrategy,hostKeyVerificationStrategy,tenancy"); assertEquals(STRATEGY_TO_CHECK, received.getHostKeyVerificationStrategy()); } @@ -226,7 +208,7 @@ public void testConfigWithSpotBidPrice() throws Exception { spotConfig.setFallbackToOndemand(false); spotConfig.setSpotBlockReservationDuration(0); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null,false, null, "", false,"", false, "",null); List templates = new ArrayList(); templates.add(orig); @@ -257,7 +239,7 @@ public void testSpotConfigWithoutBidPrice() throws Exception { SpotConfiguration spotConfig = new SpotConfiguration(false); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, "", null, false, "", false, "",null); List templates = new ArrayList(); templates.add(orig); @@ -291,7 +273,7 @@ public void testSpotConfigWithFallback() throws Exception { spotConfig.setFallbackToOndemand(true); spotConfig.setSpotBlockReservationDuration(0); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null,false, "", null, true, "", false, "", null); List templates = new ArrayList(); templates.add(orig); @@ -319,7 +301,7 @@ public void testConfigRoundtripIamRole() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "iamInstanceProfile", false, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null,false, null, "iamInstanceProfile", false, "", false, "",null); List templates = new ArrayList(); templates.add(orig); @@ -334,13 +316,13 @@ public void testConfigRoundtripIamRole() throws Exception { @Test public void testNullTimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, false, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, null, false, "",null); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testUpdateAmi() { - SlaveTemplate st = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "0", false, ""); + SlaveTemplate st = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, "0", false, "",null); assertEquals("ami1", st.getAmi()); st.setAmi("ami2"); assertEquals("ami2", st.getAmi()); @@ -350,43 +332,43 @@ public void testUpdateAmi() { @Test public void test0TimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "0", false, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, "0", false, "",null); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testNegativeTimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "-1", false, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, "-1", false, "",null); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testNonNumericTimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "NotANumber", false, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, "NotANumber", false, "",null); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testAssociatePublicIpSetting() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, true, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, null, true, "",null); assertEquals(true, st.getAssociatePublicIp()); } @Test public void testConnectUsingPublicIpSetting() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false, null, true, "", false, true); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, true, "", false, true,null); assertEquals(st.connectionStrategy, ConnectionStrategy.PUBLIC_IP); } @Test public void testConnectUsingPublicIpSettingWithDefaultSetting() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, true, ""); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, null, true, "",null); assertEquals(st.connectionStrategy, ConnectionStrategy.PUBLIC_IP); } @Test public void testBackwardCompatibleUnixData() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", "22", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "rrr", "sudo", null, null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, "NotANumber"); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", "22", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "rrr", "sudo", null, null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, "NotANumber",null); assertFalse(st.isWindowsSlave()); assertEquals(22, st.getSshPort()); assertEquals("sudo", st.getRootCommandPrefix()); @@ -403,7 +385,7 @@ public void testWindowsConfigRoundTrip() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new WindowsData("password", false, ""), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new WindowsData("password", false, ""), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, "", false, "",null); List templates = new ArrayList(); templates.add(orig); @@ -429,7 +411,7 @@ public void testUnixConfigRoundTrip() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new UnixData("sudo", null, null, "22"), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new UnixData("sudo", null, null, "22"), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, "", false, "",null); List templates = new ArrayList(); templates.add(orig); @@ -444,7 +426,7 @@ public void testUnixConfigRoundTrip() throws Exception { @Test public void testChooseSubnetId() throws Exception { - SlaveTemplate slaveTemplate = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); + SlaveTemplate slaveTemplate = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null,false, null, "", false, "", false, "",null); String subnet1 = slaveTemplate.chooseSubnetId(); String subnet2 = slaveTemplate.chooseSubnetId(); @@ -458,7 +440,7 @@ public void testChooseSubnetId() throws Exception { @Issue("JENKINS-59460") @Test public void testConnectionStrategyDeprecatedFieldsAreExported() { - SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", Collections.singletonList(new EC2Tag("name1", "value1")), null, false, null, "", true, false, "", false, ""); + SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", Collections.singletonList(new EC2Tag("name1", "value1")), null, false, null, "", true, "", false, "",null); String exported = Jenkins.XSTREAM.toXML(template); assertThat(exported, containsString("usePrivateDnsName")); @@ -483,7 +465,7 @@ public void testMinimumNumberOfInstancesActiveRangeConfig() throws Exception { spotConfig.setSpotMaxBidPrice("22"); spotConfig.setFallbackToOndemand(true); spotConfig.setSpotBlockReservationDuration(1); - SlaveTemplate slaveTemplate = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0); + SlaveTemplate slaveTemplate = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0,null); slaveTemplate.setMinimumNumberOfInstancesTimeRangeConfig(minimumNumberOfInstancesTimeRangeConfig); List templates = new ArrayList(); @@ -517,8 +499,8 @@ public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); - SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, "", associatePublicIp, "",null); + SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, "", associatePublicIp, "",null); List templates = new ArrayList(); templates.add(orig); @@ -560,8 +542,8 @@ public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Except tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); - SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, "", associatePublicIp, "",null); + SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, "", associatePublicIp, "",null); List templates = new ArrayList(); templates.add(orig); diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java index a3839035b..4a9b16c9b 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java @@ -52,7 +52,7 @@ public CreateTagsResult createTags(com.amazonaws.services.ec2.model.CreateTagsRe tags.add(tag2); String instanceId = "123"; - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, "") { + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, "", false, "",null) { @Override protected Object readResolve() { return null; @@ -89,7 +89,7 @@ public CreateTagsResult createTags(com.amazonaws.services.ec2.model.CreateTagsRe tags.add(tag2); String instanceId = "123"; - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, "") { + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, "", false, "",null) { @Override protected Object readResolve() { return null; diff --git a/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java b/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java index 8acd5eeaa..8a6e13060 100644 --- a/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java +++ b/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java @@ -56,7 +56,7 @@ private void setUpCloud(String label, Node.Mode mode) throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate template = new SlaveTemplate("ami", "foo", null, "default", "zone", InstanceType.M1Large, false, label, mode, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", true, "subnet 456", tags, null, false, null, "", false, false, null, false, ""); + SlaveTemplate template = new SlaveTemplate("ami", "foo", null, "default", "zone", InstanceType.M1Large, false, label, mode, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", true, "subnet 456", tags, null, false, null, "", false, null, false, "",null); List templates = new ArrayList(); templates.add(template); diff --git a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java index 85e4e6e4c..f3493d41f 100644 --- a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java @@ -337,7 +337,7 @@ public MockEC2Computer(EC2AbstractSlave slave) { // Create a computer private static MockEC2Computer createComputer(String suffix) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave(COMPUTER_NAME + suffix, "id" + suffix, "description" + suffix, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false,false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { + final EC2AbstractSlave slave = new EC2AbstractSlave(COMPUTER_NAME + suffix, "id" + suffix, "description" + suffix, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1,null) { @Override public void terminate() { } @@ -368,7 +368,7 @@ public EC2AbstractSlave getNode() { @Override public SlaveTemplate getSlaveTemplate() { - return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); + return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, false, "", "", false, "", false, "",null); } } diff --git a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java index 4a6b75c67..c3ca39838 100644 --- a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java +++ b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java @@ -5,6 +5,7 @@ import com.amazonaws.AmazonClientException; +import com.amazonaws.services.ec2.model.Tenancy; import hudson.Extension; import hudson.model.Computer; import hudson.model.Descriptor; @@ -17,7 +18,7 @@ public class EC2AgentFactoryMockImpl implements EC2AgentFactory { @Override public EC2OndemandSlave createOnDemandAgent(EC2AgentConfig.OnDemand config) throws Descriptor.FormException, IOException { - return new MockEC2OndemandSlave(config.name, config.instanceId, config.description, config.remoteFS, config.numExecutors, config.labelString, config.mode, config.initScript, config.tmpDir, config.nodeProperties, config.remoteAdmin, config.jvmopts, config.stopOnTerminate, config.idleTerminationMinutes, config.publicDNS, config.privateDNS, config.tags, config.cloudName, config.useDedicatedTenancy, config.launchTimeout, config.amiType, config.connectionStrategy, config.maxTotalUses); + return new MockEC2OndemandSlave(config.name, config.instanceId, config.description, config.remoteFS, config.numExecutors, config.labelString, config.mode, config.initScript, config.tmpDir, config.nodeProperties, config.remoteAdmin, config.jvmopts, config.stopOnTerminate, config.idleTerminationMinutes, config.publicDNS, config.privateDNS, config.tags, config.cloudName, config.launchTimeout, config.amiType, config.connectionStrategy, config.maxTotalUses, config.tenancy); } @Override @@ -33,11 +34,11 @@ private MockEC2OndemandSlave(String name, String instanceId, String description, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, - List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, + List tags, String cloudName, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, - int maxTotalUses) + int maxTotalUses, Tenancy tenancy) throws Descriptor.FormException, IOException { - super(name, instanceId, description, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, false, launchTimeout, amiType, connectionStrategy, maxTotalUses); + super(name, instanceId, description, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, tenancy); } @Override diff --git a/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml b/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml index e83f53ee2..77824071c 100644 --- a/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml +++ b/src/test/resources/hudson/plugins/ec2/UnixDataExport.yml @@ -31,8 +31,7 @@ useBidPrice: true stopOnTerminate: false t2Unlimited: false + tenancy: Default type: T2Micro - useDedicatedTenancy: false useEphemeralDevices: false - useHostTenancy: false useInstanceProfileForCredentials: true From 0636321696ed40d9d7dc3bda7b71319ea4f2730a Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Tue, 5 Jan 2021 01:35:43 +0530 Subject: [PATCH 17/26] Adding Tenancy attribute as drop down --- .../hudson/plugins/ec2/SlaveTemplate.java | 457 ++++++++++-------- .../plugins/ec2/EC2RetentionStrategyTest.java | 207 +++++--- 2 files changed, 393 insertions(+), 271 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index 28b7f633e..e15d9840a 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -68,6 +68,7 @@ import java.util.Base64; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; @@ -240,7 +241,7 @@ public class SlaveTemplate implements Describable { private final List tags; public ConnectionStrategy connectionStrategy; - + public HostKeyVerificationStrategyEnum hostKeyVerificationStrategy; public final boolean associatePublicIp; @@ -261,10 +262,27 @@ public class SlaveTemplate implements Describable { public String currentSubnetId; + public final Tenancy tenancy; + private transient/* almost final */ Set labelSet; private transient/* almost final */Set securityGroupSet; + /* FIXME: Ideally these would be List, but Jenkins currently + * doesn't offer a usable way to represent those in forms. Instead + * the values are interpreted as a comma separated list. + * + * https://issues.jenkins.io/browse/JENKINS-27901 + */ + @CheckForNull + private String amiOwners; + + @CheckForNull + private String amiUsers; + + @CheckForNull + private List amiFilters; + /* * Necessary to handle reading from old configurations. The UnixData object is created in readResolve() */ @@ -286,8 +304,6 @@ public class SlaveTemplate implements Describable { @Deprecated public boolean connectUsingPublicIp; - public final Tenancy tenancy; - @DataBoundConstructor public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, @@ -361,7 +377,6 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri this.hostKeyVerificationStrategy = hostKeyVerificationStrategy != null ? hostKeyVerificationStrategy : HostKeyVerificationStrategyEnum.CHECK_NEW_SOFT; this.tenancy = tenancy == null ? Tenancy.Default : tenancy; - readResolve(); // initialize } @@ -375,27 +390,6 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, List> nodeProperties, Tenancy tenancy) { - this(ami, zone, spotConfig, securityGroups, remoteFS, - type, ebsOptimized, labelString, mode, description, initScript, - tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, - stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, - minimumNumberOfSpareInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices,launchTimeoutStr, associatePublicIp, - customDeviceMapping, connectBySSHProcess, monitoring, - t2Unlimited, connectionStrategy, maxTotalUses, - nodeProperties, null,tenancy); - } - - @Deprecated - public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, - List> nodeProperties) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, @@ -404,18 +398,18 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri useEphemeralDevices, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, - nodeProperties,null); + nodeProperties, null, tenancy); } @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses,List> nodeProperties , Tenancy tenancy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses,List> nodeProperties, Tenancy tenancy ) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, @@ -425,13 +419,13 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, @@ -449,21 +443,21 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, - tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, - idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, - monitoring, t2Unlimited, connectionStrategy, maxTotalUses, tenancy); + tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, + idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, + launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + monitoring, t2Unlimited, connectionStrategy, maxTotalUses, tenancy); } @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, boolean monitoring, - boolean t2Unlimited, Tenancy tenancy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, boolean monitoring, + boolean t2Unlimited, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, @@ -472,12 +466,12 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, Tenancy tenancy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, @@ -486,12 +480,12 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, - boolean connectBySSHProcess, Tenancy tenancy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, + boolean connectBySSHProcess, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, false, useEphemeralDevices, @@ -499,11 +493,11 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, boolean usePrivateDnsName, - String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, Tenancy tenancy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, Tenancy tenancy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, useEphemeralDevices, @@ -514,19 +508,17 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri * Backward compatible constructor for reloading previous version data */ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, - String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, - String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - String launchTimeoutStr, Tenancy tenancy) { + String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, + String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, + String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + String launchTimeoutStr) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, new UnixData(rootCommandPrefix, slaveCommandPrefix, slaveCommandSuffix, sshPort), jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, - useEphemeralDevices, launchTimeoutStr, false,null,false,tenancy); + useEphemeralDevices, launchTimeoutStr, false, null, null); } - - public boolean isConnectBySSHProcess() { // See // src/main/resources/hudson/plugins/ec2/SlaveTemplate/help-connectBySSHProcess.html @@ -755,18 +747,48 @@ public String getIamInstanceProfile() { @DataBoundSetter public void setHostKeyVerificationStrategy(HostKeyVerificationStrategyEnum hostKeyVerificationStrategy) { - this.hostKeyVerificationStrategy = (hostKeyVerificationStrategy != null) ? hostKeyVerificationStrategy : HostKeyVerificationStrategyEnum.CHECK_NEW_SOFT; + this.hostKeyVerificationStrategy = (hostKeyVerificationStrategy != null) ? hostKeyVerificationStrategy : HostKeyVerificationStrategyEnum.CHECK_NEW_SOFT; } - + @NonNull public HostKeyVerificationStrategyEnum getHostKeyVerificationStrategy() { return hostKeyVerificationStrategy != null ? hostKeyVerificationStrategy : HostKeyVerificationStrategyEnum.CHECK_NEW_SOFT; } - + + @CheckForNull + public String getAmiOwners() { + return amiOwners; + } + + @DataBoundSetter + public void setAmiOwners(String amiOwners) { + this.amiOwners = amiOwners; + } + + @CheckForNull + public String getAmiUsers() { + return amiUsers; + } + + @DataBoundSetter + public void setAmiUsers(String amiUsers) { + this.amiUsers = amiUsers; + } + + @CheckForNull + public List getAmiFilters() { + return amiFilters; + } + + @DataBoundSetter + public void setAmiFilters(List amiFilters) { + this.amiFilters = amiFilters; + } + @Override public String toString() { return "SlaveTemplate{" + - "ami='" + ami + '\'' + + "description='" + description + '\'' + ", labels='" + labels + '\'' + '}'; } @@ -775,14 +797,14 @@ public int getMaxTotalUses() { return maxTotalUses; } - public DescribableList, NodePropertyDescriptor> getNodeProperties() { - return Objects.requireNonNull(nodeProperties); - } - public Tenancy getTenancyAttribute() { return tenancy; } + public DescribableList, NodePropertyDescriptor> getNodeProperties() { + return Objects.requireNonNull(nodeProperties); + } + public enum ProvisionOptions { ALLOW_CREATE, FORCE_CREATE } /** @@ -791,12 +813,13 @@ public enum ProvisionOptions { ALLOW_CREATE, FORCE_CREATE } * @return always non-null. This needs to be then added to {@link Hudson#addNode(Node)}. */ public List provision(int number, EnumSet provisionOptions) throws AmazonClientException, IOException { + final Image image = getImage(); if (this.spotConfig != null) { if (provisionOptions.contains(ProvisionOptions.ALLOW_CREATE) || provisionOptions.contains(ProvisionOptions.FORCE_CREATE)) - return provisionSpot(number, provisionOptions); + return provisionSpot(image, number, provisionOptions); return null; } - return provisionOndemand(number, provisionOptions); + return provisionOndemand(image, number, provisionOptions); } /** @@ -806,8 +829,8 @@ private boolean checkInstance(Instance instance) { for (EC2AbstractSlave node : NodeIterator.nodes(EC2AbstractSlave.class)) { if ( (node.getInstanceId().equals(instance.getInstanceId())) && (! (instance.getState().getName().equalsIgnoreCase(InstanceStateName.Stopped.toString()) - )) - ){ + )) + ){ logInstanceCheck(instance, ". false - found existing corresponding Jenkins slave: " + node.getInstanceId()); return false; } @@ -836,12 +859,18 @@ private void logProvisionInfo(String message) { LOGGER.info(this + ". " + message); } + HashMap> makeRunInstancesRequestAndFilters(Image image, int number, AmazonEC2 ec2) throws IOException { + return makeRunInstancesRequestAndFilters(image, number, ec2, true); + } + + @Deprecated HashMap> makeRunInstancesRequestAndFilters(int number, AmazonEC2 ec2) throws IOException { - return makeRunInstancesRequestAndFilters(number, ec2, true); + return makeRunInstancesRequestAndFilters(getImage(), number, ec2); } - HashMap> makeRunInstancesRequestAndFilters(int number, AmazonEC2 ec2, boolean rotateSubnet) throws IOException { - RunInstancesRequest riRequest = new RunInstancesRequest(ami, 1, number).withInstanceType(type); + HashMap> makeRunInstancesRequestAndFilters(Image image, int number, AmazonEC2 ec2, boolean rotateSubnet) throws IOException { + String imageId = image.getImageId(); + RunInstancesRequest riRequest = new RunInstancesRequest(imageId, 1, number).withInstanceType(type); riRequest.setEbsOptimized(ebsOptimized); riRequest.setMonitoring(monitoring); @@ -851,7 +880,7 @@ HashMap> makeRunInstancesRequestAndFilters(int riRequest.setCreditSpecification(creditRequest); } - setupBlockDeviceMappings(riRequest.getBlockDeviceMappings()); + setupBlockDeviceMappings(image, riRequest.getBlockDeviceMappings()); if(stopOnTerminate){ riRequest.setInstanceInitiatedShutdownBehavior(ShutdownBehavior.Stop); @@ -862,7 +891,7 @@ HashMap> makeRunInstancesRequestAndFilters(int } List diFilters = new ArrayList<>(); - diFilters.add(new Filter("image-id").withValues(ami)); + diFilters.add(new Filter("image-id").withValues(imageId)); diFilters.add(new Filter("instance-type").withValues(type.toString())); KeyPair keyPair = getKeyPair(ec2); @@ -874,6 +903,7 @@ HashMap> makeRunInstancesRequestAndFilters(int riRequest.setKeyName(keyPair.getKeyName()); diFilters.add(new Filter("key-name").withValues(keyPair.getKeyName())); + if (StringUtils.isNotBlank(getZone())) { Placement placement = new Placement(getZone()); if (getTenancyAttribute().equals(Tenancy.Dedicated)) { @@ -925,9 +955,9 @@ HashMap> makeRunInstancesRequestAndFilters(int } } else { List groupIds = getSecurityGroupsBy("group-name", securityGroupSet, ec2) - .getSecurityGroups() - .stream().map(SecurityGroup::getGroupId) - .collect(Collectors.toList()); + .getSecurityGroups() + .stream().map(SecurityGroup::getGroupId) + .collect(Collectors.toList()); if (getAssociatePublicIp()) { net.setGroups(groupIds); } else { @@ -966,24 +996,29 @@ HashMap> makeRunInstancesRequestAndFilters(int return ret; } + @Deprecated + HashMap> makeRunInstancesRequestAndFilters(int number, AmazonEC2 ec2, boolean rotateSubnet) throws IOException { + return makeRunInstancesRequestAndFilters(getImage(), number, ec2, rotateSubnet); + } + /** * Provisions an On-demand EC2 slave by launching a new instance or starting a previously-stopped instance. */ - private List provisionOndemand(int number, EnumSet provisionOptions) + private List provisionOndemand(Image image, int number, EnumSet provisionOptions) throws IOException { - return provisionOndemand(number, provisionOptions, false, false); + return provisionOndemand(image, number, provisionOptions, false, false); } /** * Provisions an On-demand EC2 slave by launching a new instance or starting a previously-stopped instance. */ - private List provisionOndemand(int number, EnumSet provisionOptions, boolean spotWithoutBidPrice, boolean fallbackSpotToOndemand) + private List provisionOndemand(Image image, int number, EnumSet provisionOptions, boolean spotWithoutBidPrice, boolean fallbackSpotToOndemand) throws IOException { AmazonEC2 ec2 = getParent().connect(); logProvisionInfo("Considering launching"); - HashMap> runInstancesRequestFilterMap = makeRunInstancesRequestAndFilters(number, ec2); + HashMap> runInstancesRequestFilterMap = makeRunInstancesRequestAndFilters(image, number, ec2); Map.Entry> entry = runInstancesRequestFilterMap.entrySet().iterator().next(); RunInstancesRequest riRequest = entry.getKey(); List diFilters = entry.getValue(); @@ -1106,10 +1141,10 @@ List findOrphansOrStopped(DescribeInstancesResult diResult, int number return orphansOrStopped; } - private void setupRootDevice(List deviceMappings) { - if (deleteRootOnTermination && getImage().getRootDeviceType().equals("ebs")) { + private void setupRootDevice(Image image, List deviceMappings) { + if (deleteRootOnTermination && image.getRootDeviceType().equals("ebs")) { // get the root device (only one expected in the blockmappings) - final List rootDeviceMappings = getAmiBlockDeviceMappings(); + final List rootDeviceMappings = image.getBlockDeviceMappings(); if (rootDeviceMappings.size() == 0) { LOGGER.warning("AMI missing block devices"); return; @@ -1137,9 +1172,9 @@ private void setupRootDevice(List deviceMappings) { } } - private List getNewEphemeralDeviceMapping() { + private List getNewEphemeralDeviceMapping(Image image) { - final List oldDeviceMapping = getAmiBlockDeviceMappings(); + final List oldDeviceMapping = image.getBlockDeviceMappings(); final Set occupiedDevices = new HashSet<>(); for (final BlockDeviceMapping mapping : oldDeviceMapping) { @@ -1168,31 +1203,55 @@ private List getNewEphemeralDeviceMapping() { return newDeviceMapping; } - private void setupEphemeralDeviceMapping(List deviceMappings) { + private void setupEphemeralDeviceMapping(Image image, List deviceMappings) { // Don't wipe out pre-existing mappings - deviceMappings.addAll(getNewEphemeralDeviceMapping()); + deviceMappings.addAll(getNewEphemeralDeviceMapping(image)); } - private List getAmiBlockDeviceMappings() { - - /* - * AmazonEC2#describeImageAttribute does not work due to a bug - * https://forums.aws.amazon.com/message.jspa?messageID=231972 - */ - return getImage().getBlockDeviceMappings(); + @NonNull + private static List makeImageAttributeList(@CheckForNull String attr) { + return Stream.of(Util.tokenize(Util.fixNull(attr))) + .collect(Collectors.toList()); } - private Image getImage() { - DescribeImagesRequest request = new DescribeImagesRequest().withImageIds(ami); - for (final Image image : getParent().connect().describeImages(request).getImages()) { + @NonNull + private DescribeImagesRequest makeDescribeImagesRequest() { + List imageIds = Util.fixEmptyAndTrim(ami) == null ? + Collections.emptyList() : + Collections.singletonList(ami); + List owners = makeImageAttributeList(amiOwners); + List users = makeImageAttributeList(amiUsers); + List filters = EC2Filter.toFilterList(amiFilters); + + // Log a warning if there were no search attributes. This is + // legal but probably not what anyone wants. Might be better + // as an exception. + int numAttrs = Stream.of(imageIds, owners, users, filters) + .collect(Collectors.summingInt(List::size)); + if (numAttrs == 0) { + LOGGER.warning("Neither AMI ID nor AMI search attributes provided"); + } + + return new DescribeImagesRequest() + .withImageIds(imageIds) + .withOwners(owners) + .withExecutableUsers(users) + .withFilters(filters); + } - if (ami.equals(image.getImageId())) { + @NonNull + private Image getImage() throws AmazonClientException { + DescribeImagesRequest request = makeDescribeImagesRequest(); - return image; - } + LOGGER.info("Getting image for request " + request); + List images = getParent().connect().describeImages(request).getImages(); + if (images.isEmpty()) { + throw new AmazonClientException("Unable to find image for request " + request); } - throw new AmazonClientException("Unable to find AMI " + ami); + // Sort in reverse by creation date to get latest image + images.sort(Comparator.comparing(Image::getCreationDate).reversed()); + return images.get(0); } @@ -1205,16 +1264,17 @@ private void setupCustomDeviceMapping(List deviceMappings) { /** * Provision a new slave for an EC2 spot instance to call back to Jenkins */ - private List provisionSpot(int number, EnumSet provisionOptions) + private List provisionSpot(Image image, int number, EnumSet provisionOptions) throws IOException { if (!spotConfig.useBidPrice) { - return provisionOndemand(1, provisionOptions, true, spotConfig.getFallbackToOndemand()); + return provisionOndemand(image, 1, provisionOptions, true, spotConfig.getFallbackToOndemand()); } AmazonEC2 ec2 = getParent().connect(); + String imageId = image.getImageId(); try { - LOGGER.info("Launching " + ami + " for template " + description); + LOGGER.info("Launching " + imageId + " for template " + description); KeyPair keyPair = getKeyPair(ec2); @@ -1230,7 +1290,7 @@ private List provisionSpot(int number, EnumSet provisionSpot(int number, EnumSet groupIds = getSecurityGroupsBy("group-name", securityGroupSet, ec2) - .getSecurityGroups() - .stream().map(SecurityGroup::getGroupId) - .collect(Collectors.toList()); + .getSecurityGroups() + .stream().map(SecurityGroup::getGroupId) + .collect(Collectors.toList()); net.setGroups(groupIds); } } @@ -1280,7 +1340,7 @@ private List provisionSpot(int number, EnumSet provisionSpot(int number, EnumSet requestsToCancel = reqInstances.stream().map(SpotInstanceRequest::getSpotInstanceRequestId).collect(Collectors.toList()); CancelSpotInstanceRequestsRequest cancelRequest = new CancelSpotInstanceRequestsRequest(requestsToCancel); ec2.cancelSpotInstanceRequests(cancelRequest); - return provisionOndemand(number, provisionOptions); + return provisionOndemand(image, number, provisionOptions); } } @@ -1337,17 +1397,17 @@ private List provisionSpot(int number, EnumSet blockDeviceMappings) { - setupRootDevice(blockDeviceMappings); + private void setupBlockDeviceMappings(Image image, List blockDeviceMappings) { + setupRootDevice(image, blockDeviceMappings); if (useEphemeralDevices) { - setupEphemeralDeviceMapping(blockDeviceMappings); + setupEphemeralDeviceMapping(image, blockDeviceMappings); } else { setupCustomDeviceMapping(blockDeviceMappings); } @@ -1381,55 +1441,55 @@ private HashSet buildTags(String slaveType) { protected EC2OndemandSlave newOndemandSlave(Instance inst) throws FormException, IOException { EC2AgentConfig.OnDemand config = new EC2AgentConfig.OnDemandBuilder() - .withName(getSlaveName(inst.getInstanceId())) - .withInstanceId(inst.getInstanceId()) - .withDescription(description) - .withRemoteFS(remoteFS) - .withNumExecutors(getNumExecutors()) - .withLabelString(labels) - .withMode(mode) - .withInitScript(initScript) - .withTmpDir(tmpDir) - .withNodeProperties(nodeProperties.toList()) - .withRemoteAdmin(remoteAdmin) - .withJvmopts(jvmopts) - .withStopOnTerminate(stopOnTerminate) - .withIdleTerminationMinutes(idleTerminationMinutes) - .withPublicDNS(inst.getPublicDnsName()) - .withPrivateDNS(inst.getPrivateDnsName()) - .withTags(EC2Tag.fromAmazonTags(inst.getTags())) - .withCloudName(parent.name) - .withLaunchTimeout(getLaunchTimeout()) - .withAmiType(amiType) - .withConnectionStrategy(connectionStrategy) - .withMaxTotalUses(maxTotalUses) - .withTenancyAttribute(tenancy) - .build(); + .withName(getSlaveName(inst.getInstanceId())) + .withInstanceId(inst.getInstanceId()) + .withDescription(description) + .withRemoteFS(remoteFS) + .withNumExecutors(getNumExecutors()) + .withLabelString(labels) + .withMode(mode) + .withInitScript(initScript) + .withTmpDir(tmpDir) + .withNodeProperties(nodeProperties.toList()) + .withRemoteAdmin(remoteAdmin) + .withJvmopts(jvmopts) + .withStopOnTerminate(stopOnTerminate) + .withIdleTerminationMinutes(idleTerminationMinutes) + .withPublicDNS(inst.getPublicDnsName()) + .withPrivateDNS(inst.getPrivateDnsName()) + .withTags(EC2Tag.fromAmazonTags(inst.getTags())) + .withCloudName(parent.name) + .withLaunchTimeout(getLaunchTimeout()) + .withAmiType(amiType) + .withConnectionStrategy(connectionStrategy) + .withMaxTotalUses(maxTotalUses) + .withTenancyAttribute(tenancy) + .build(); return EC2AgentFactory.getInstance().createOnDemandAgent(config); } protected EC2SpotSlave newSpotSlave(SpotInstanceRequest sir) throws FormException, IOException { EC2AgentConfig.Spot config = new EC2AgentConfig.SpotBuilder() - .withName(getSlaveName(sir.getSpotInstanceRequestId())) - .withSpotInstanceRequestId(sir.getSpotInstanceRequestId()) - .withDescription(description) - .withRemoteFS(remoteFS) - .withNumExecutors(getNumExecutors()) - .withMode(mode) - .withInitScript(initScript) - .withTmpDir(tmpDir) - .withLabelString(labels) - .withNodeProperties(nodeProperties.toList()) - .withRemoteAdmin(remoteAdmin) - .withJvmopts(jvmopts) - .withIdleTerminationMinutes(idleTerminationMinutes) - .withTags(EC2Tag.fromAmazonTags(sir.getTags())) - .withCloudName(parent.name) - .withLaunchTimeout(getLaunchTimeout()) - .withAmiType(amiType) - .withConnectionStrategy(connectionStrategy) - .withMaxTotalUses(maxTotalUses) - .build(); + .withName(getSlaveName(sir.getSpotInstanceRequestId())) + .withSpotInstanceRequestId(sir.getSpotInstanceRequestId()) + .withDescription(description) + .withRemoteFS(remoteFS) + .withNumExecutors(getNumExecutors()) + .withMode(mode) + .withInitScript(initScript) + .withTmpDir(tmpDir) + .withLabelString(labels) + .withNodeProperties(nodeProperties.toList()) + .withRemoteAdmin(remoteAdmin) + .withJvmopts(jvmopts) + .withIdleTerminationMinutes(idleTerminationMinutes) + .withTags(EC2Tag.fromAmazonTags(sir.getTags())) + .withCloudName(parent.name) + .withLaunchTimeout(getLaunchTimeout()) + .withAmiType(amiType) + .withConnectionStrategy(connectionStrategy) + .withMaxTotalUses(maxTotalUses) + .build(); return EC2AgentFactory.getInstance().createSpotAgent(config); } @@ -1535,7 +1595,7 @@ public EC2AbstractSlave attach(String instanceId, TaskListener listener) throws return newOndemandSlave(inst); } catch (FormException e) { throw new AssertionError(); // we should have discovered all - // configuration issues upfront + // configuration issues upfront } } @@ -1564,7 +1624,7 @@ protected Object readResolve() { amiType = new UnixData(rootCommandPrefix, slaveCommandPrefix, slaveCommandSuffix, sshPort); } - // 1.43 new parameters + // 1.43 new parameters if (connectionStrategy == null ) { connectionStrategy = ConnectionStrategy.backwardsCompatible(usePrivateDnsName, connectUsingPublicIp, associatePublicIp); } @@ -1619,7 +1679,7 @@ public boolean isUseHTTPS() { * @return DescribeInstancesResult of DescribeInstanceRequst constructed from this SlaveTemplate's configs */ DescribeInstancesResult getDescribeInstanceResult(AmazonEC2 ec2, boolean allSubnets) throws IOException { - HashMap> runInstancesRequestFilterMap = makeRunInstancesRequestAndFilters(1, ec2, false); + HashMap> runInstancesRequestFilterMap = makeRunInstancesRequestAndFilters(getImage(), 1, ec2, false); Map.Entry> entry = runInstancesRequestFilterMap.entrySet().iterator().next(); List diFilters = entry.getValue(); @@ -1724,9 +1784,9 @@ public FormValidation doCheckJvmopts(@QueryParameter String value){ */ @RequirePOST public FormValidation doValidateAmi(@QueryParameter boolean useInstanceProfileForCredentials, - @QueryParameter String credentialsId, @QueryParameter String ec2endpoint, - @QueryParameter String region, final @QueryParameter String ami, @QueryParameter String roleArn, - @QueryParameter String roleSessionName) throws IOException { + @QueryParameter String credentialsId, @QueryParameter String ec2endpoint, + @QueryParameter String region, final @QueryParameter String ami, @QueryParameter String roleArn, + @QueryParameter String roleSessionName) throws IOException { checkPermission(EC2Cloud.PROVISION); AWSCredentialsProvider credentialsProvider = EC2Cloud.createCredentialsProvider(useInstanceProfileForCredentials, credentialsId, roleArn, roleSessionName, region); AmazonEC2 ec2; @@ -1801,8 +1861,8 @@ public FormValidation doCheckMinimumNumberOfInstances(@QueryParameter String val } if (val > instanceCap) { return FormValidation - .error("Minimum number of instances must not be larger than AMI Instance Cap %d", - instanceCap); + .error("Minimum number of instances must not be larger than AMI Instance Cap %d", + instanceCap); } return FormValidation.ok(); } @@ -1856,8 +1916,8 @@ public FormValidation doCheckMinimumNumberOfSpareInstances(@QueryParameter Strin } if (val > instanceCap) { return FormValidation - .error("Minimum number of spare instances must not be larger than AMI Instance Cap %d", - instanceCap); + .error("Minimum number of spare instances must not be larger than AMI Instance Cap %d", + instanceCap); } return FormValidation.ok(); } @@ -1907,14 +1967,19 @@ public FormValidation doCheckLaunchTimeoutStr(@QueryParameter String value) { @RequirePOST public ListBoxModel doFillZoneItems(@QueryParameter boolean useInstanceProfileForCredentials, - @QueryParameter String credentialsId, @QueryParameter String region, @QueryParameter String roleArn, - @QueryParameter String roleSessionName) + @QueryParameter String credentialsId, @QueryParameter String region, @QueryParameter String roleArn, + @QueryParameter String roleSessionName) throws IOException, ServletException { checkPermission(EC2Cloud.PROVISION); AWSCredentialsProvider credentialsProvider = EC2Cloud.createCredentialsProvider(useInstanceProfileForCredentials, credentialsId, roleArn, roleSessionName, region); return EC2AbstractSlave.fillZoneItems(credentialsProvider, region); } + public String getDefaultTenancy() { + // new templates default to the most secure strategy + return Tenancy.Default.name(); + } + /* * Validate the Spot Max Bid Price to ensure that it is a floating point number >= .001 */ @@ -1947,12 +2012,12 @@ public ListBoxModel doFillConnectionStrategyItems(@QueryParameter String connect public FormValidation doCheckConnectionStrategy(@QueryParameter String connectionStrategy) { return Stream.of(ConnectionStrategy.values()) - .filter(v -> v.equalsName(connectionStrategy)) + .filter(v -> v.name().equals(connectionStrategy)) .findFirst() .map(s -> FormValidation.ok()) .orElse(FormValidation.error("Could not find selected connection strategy")); } - + public String getDefaultHostKeyVerificationStrategy() { // new templates default to the most secure strategy return HostKeyVerificationStrategyEnum.CHECK_NEW_HARD.name(); @@ -1978,11 +2043,6 @@ public FormValidation doCheckHostKeyVerificationStrategy(@QueryParameter String return okResult.orElse(FormValidation.error(String.format("Could not find selected host key verification (%s)", hostKeyVerificationStrategy))); } - public String getDefaultTenancy() { - // new templates default to the most secure strategy - return Tenancy.Default.name(); - } - public ListBoxModel doFillTenancyItems(@QueryParameter String tenancy) { return Stream.of(Tenancy.values()) .map(v -> { @@ -1994,6 +2054,5 @@ public ListBoxModel doFillTenancyItems(@QueryParameter String tenancy) { }) .collect(Collectors.toCollection(ListBoxModel::new)); } - } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java index a37e9c19c..dc7c674cc 100644 --- a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java @@ -2,21 +2,26 @@ import com.amazonaws.AmazonClientException; import com.amazonaws.services.ec2.model.InstanceType; - +import hudson.model.Executor; +import hudson.model.Node; import hudson.plugins.ec2.util.AmazonEC2FactoryMockImpl; import hudson.plugins.ec2.util.MinimumInstanceChecker; import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig; import hudson.plugins.ec2.util.PrivateKeyHelper; +import hudson.plugins.ec2.util.SSHCredentialHelper; import hudson.slaves.NodeProperty; -import hudson.model.Executor; -import hudson.model.Node; - +import hudson.slaves.OfflineCause; +import jenkins.util.NonLocalizable; import net.sf.json.JSONObject; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; +import org.testcontainers.shaded.org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.jvnet.hudson.test.LoggerRule; +import java.security.Security; import java.time.Clock; +import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.time.Month; @@ -27,8 +32,13 @@ import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.logging.Level; import java.util.stream.Collectors; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -37,6 +47,9 @@ public class EC2RetentionStrategyTest { @Rule public JenkinsRule r = new JenkinsRule(); + @Rule + public LoggerRule logging = new LoggerRule(); + final AtomicBoolean idleTimeoutCalled = new AtomicBoolean(false); final AtomicBoolean terminateCalled = new AtomicBoolean(false); private static ZoneId zoneId = ZoneId.systemDefault(); @@ -68,6 +81,14 @@ public void testOnBillingHourRetention() throws Exception { } private EC2Computer computerWithIdleTime(final int minutes, final int seconds) throws Exception { + return computerWithIdleTime(minutes, seconds, false, null); + } + + /* + * Creates a computer with the params passed. If isOnline is null, the computer returns the real value, otherwise, + * the computer returns the value established. + */ + private EC2Computer computerWithIdleTime(final int minutes, final int seconds, final Boolean isOffline, final Boolean isConnecting) throws Exception { final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1,null) { @Override public void terminate() { @@ -97,7 +118,7 @@ public long getUptime() throws AmazonClientException, InterruptedException { @Override public boolean isOffline() { - return false; + return isOffline == null ? super.isOffline() : isOffline; } @Override @@ -107,11 +128,16 @@ public InstanceState getState() { @Override public SlaveTemplate getSlaveTemplate() { - return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null,false, null, "", false, "", false, "",null); + return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, "", false, "",null); + } + + @Override + public boolean isConnecting() { + return isConnecting == null ? super.isConnecting() : isConnecting; } }; assertTrue(computer.isIdle()); - assertTrue(computer.isOnline()); + assertTrue(isOffline == null || computer.isOffline() == isOffline); return computer; } @@ -167,6 +193,41 @@ public EC2AbstractSlave getNode() { return computer; } + /** + * Even though the computer is offline, we terminate it if it's not connecting now and the idle timeout expired. + */ + @Test + public void testTerminateOfflineComputerIfNotConnecting() throws Exception { + logging.record(hudson.plugins.ec2.EC2RetentionStrategy.class, Level.FINE); + logging.capture(5); + + // The clock of the retention is set to 5 minutes in the future to pretend the computer is idle. The idle + // timeout is in minutes and the minimum is 1. + Instant twoMinutesAgo = Instant.now().plus(Duration.ofMinutes(5)); + long nextCheckAfter = twoMinutesAgo.toEpochMilli(); + Clock clock = Clock.fixed(twoMinutesAgo.plusSeconds(1), zoneId); + EC2RetentionStrategy rs = new EC2RetentionStrategy("1", clock, nextCheckAfter); + + OfflineCause cause = OfflineCause.create(new NonLocalizable("Testing terminate on offline computer")); + + // A computer returning the real isOffline value and still connecting + EC2Computer computer = computerWithIdleTime(0, 0, null, true); + computer.setTemporarilyOffline(true, cause); + // We don't terminate this one + rs.check(computer); + assertThat("The computer is not terminated, it should still accept tasks", idleTimeoutCalled.get(), equalTo(false)); + assertThat(logging.getMessages(), hasItem(containsString("connecting and still offline, will check if the launch timeout has expired"))); + + // A computer returning the real isOffline value and not connecting + rs = new EC2RetentionStrategy("1", clock, nextCheckAfter); + EC2Computer computer2 = computerWithIdleTime(0, 0, null, false); + computer.setTemporarilyOffline(true, cause); + // We terminate this one + rs.check(computer2); + assertThat("The computer is terminated, it should not accept more tasks", idleTimeoutCalled.get(), equalTo(true)); + assertThat(logging.getMessages(), hasItem(containsString("offline but not connecting, will check if it should be terminated because of the idle time configured"))); + } + @Test public void testInternalCheckRespectsWait() throws Exception { List expected = new ArrayList(); @@ -207,19 +268,20 @@ public void testInternalCheckRespectsWait() throws Exception { public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); - AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); + SSHCredentialHelper.assureSshCredentialAvailableThroughCredentialProviders("ghi"); + AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", null, "ghi", "3", + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -230,9 +292,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check too assertEquals(2, computers.size()); @@ -242,9 +304,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { cloud.provision(template, 1); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have three slaves before any checking assertEquals(3, computers.size()); @@ -254,9 +316,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check assertEquals(2, computers.size()); @@ -266,9 +328,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { @Test public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -288,17 +350,17 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws //Set fixed clock to be able to test properly MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); - - AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + SSHCredentialHelper.assureSshCredentialAvailableThroughCredentialProviders("ghi"); + AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", null, "ghi", "3", + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -309,9 +371,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check too assertEquals(2, computers.size()); @@ -322,9 +384,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws @Test public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -346,15 +408,15 @@ public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Excep MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have zero slaves assertEquals(0, computers.size()); @@ -363,9 +425,9 @@ public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Excep @Test public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidnight() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("15:00"); @@ -385,17 +447,17 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni //Set fixed clock to be able to test properly MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); - - AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + SSHCredentialHelper.assureSshCredentialAvailableThroughCredentialProviders("ghi"); + AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", null, "ghi", "3", + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -406,9 +468,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check too assertEquals(2, computers.size()); @@ -418,9 +480,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni @Test public void testRetentionStopsAfterActiveRangeEnds() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -440,16 +502,17 @@ public void testRetentionStopsAfterActiveRangeEnds() throws Exception { LocalDateTime localDateTime = LocalDateTime.of(2019, Month.SEPTEMBER, 24, 14, 0); //Tuesday MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); - AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + SSHCredentialHelper.assureSshCredentialAvailableThroughCredentialProviders("ghi"); + AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", null, "ghi", "3", + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -464,9 +527,9 @@ public void testRetentionStopsAfterActiveRangeEnds() throws Exception { checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have 1 slaves after check assertEquals(1, computers.size()); @@ -478,4 +541,4 @@ private static void checkRetentionStrategy(EC2RetentionStrategy rs, EC2Computer EC2AbstractSlave node = c.getNode(); assertTrue(node.terminateScheduled.await(10, TimeUnit.SECONDS)); } -} +} \ No newline at end of file From 9ac980bc44129a62c43c0c9ae169c9c6af66f17d Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Tue, 5 Jan 2021 17:46:16 +0530 Subject: [PATCH 18/26] Fixing builds --- .../plugins/ec2/EC2SlaveMonitorTest.java | 26 ++++++++++--------- .../hudson/plugins/ec2/SlaveTemplateTest.java | 2 +- .../plugins/ec2/SlaveTemplateUnitTest.java | 2 +- .../ec2/UnixDataExport-withAltEndpoint.yml | 2 +- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java b/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java index 038640fa3..6bb2050d0 100644 --- a/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java @@ -13,7 +13,7 @@ import com.amazonaws.services.ec2.model.InstanceType; import hudson.model.Node; -import hudson.plugins.ec2.util.PrivateKeyHelper; +import hudson.plugins.ec2.util.SSHCredentialHelper; import jenkins.model.Jenkins; public class EC2SlaveMonitorTest { @@ -30,7 +30,8 @@ public void init(){ @Test public void testMinimumNumberOfInstances() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0,null); - AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", Collections.singletonList(template), "roleArn", "roleSessionName"); + SSHCredentialHelper.assureSshCredentialAvailableThroughCredentialProviders("ghi"); + AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", null, "ghi", "3", Collections.singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); @@ -41,17 +42,18 @@ public void testMinimumNumberOfInstances() throws Exception { public void testMinimumNumberOfSpareInstances() throws Exception { // Arguments split onto newlines matching the construtor definition to make figuring which is which easier. SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "defaultsecgroup", "remotefs", - InstanceType.M1Large, false, "label", Node.Mode.NORMAL, "description", "init script", - "tmpdir", "userdata", "10", "remoteadmin", null, "-Xmx1g", - false, "subnet 456", null, "0", 0, - null, null, false, true, - "", false, "", - false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, - null); - AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", Collections.singletonList(template), "roleArn", "roleSessionName"); + InstanceType.M1Large, false, "label", Node.Mode.NORMAL, "description", "init script", + "tmpdir", "userdata", "10", "remoteadmin", null, "-Xmx1g", + false, "subnet 456", null, "0", 0, + 2, null, null, true, + true, "",false, "", false, + false, + true, ConnectionStrategy.PRIVATE_IP, 0, + null,null); + SSHCredentialHelper.assureSshCredentialAvailableThroughCredentialProviders("ghi"); + AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", null, "ghi", "3", Collections.singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); Assert.assertEquals(2, Arrays.stream(Jenkins.get().getComputers()).filter(computer -> computer instanceof EC2Computer).count()); } -} +} \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java index 112ade7ca..940855a3c 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java @@ -368,7 +368,7 @@ public void testConnectUsingPublicIpSettingWithDefaultSetting() { @Test public void testBackwardCompatibleUnixData() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", "22", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "rrr", "sudo", null, null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, "NotANumber",null); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", "22", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "rrr", "sudo", null, null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, "NotANumber"); assertFalse(st.isWindowsSlave()); assertEquals(22, st.getSshPort()); assertEquals("sudo", st.getRootCommandPrefix()); diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java index 8eca7b3a3..36cb67936 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java @@ -167,7 +167,7 @@ private void doTestMakeDescribeImagesRequest(SlaveTemplate template, @Test public void testMakeDescribeImagesRequest() throws Exception { - SlaveTemplate template = new SlaveTemplate(null, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "", true, false, "", false, "") { + SlaveTemplate template = new SlaveTemplate(null, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "", true, "", false, "",null) { @Override protected Object readResolve() { return null; diff --git a/src/test/resources/hudson/plugins/ec2/UnixDataExport-withAltEndpoint.yml b/src/test/resources/hudson/plugins/ec2/UnixDataExport-withAltEndpoint.yml index db6899ceb..c8899ff8d 100644 --- a/src/test/resources/hudson/plugins/ec2/UnixDataExport-withAltEndpoint.yml +++ b/src/test/resources/hudson/plugins/ec2/UnixDataExport-withAltEndpoint.yml @@ -32,7 +32,7 @@ useBidPrice: true stopOnTerminate: false t2Unlimited: false + tenancy: Default type: T2Micro - useDedicatedTenancy: false useEphemeralDevices: false useInstanceProfileForCredentials: true From c78128b7fa18ff4f79e41e2e7b4004dd6e1d625d Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Sat, 6 Mar 2021 23:28:21 +0530 Subject: [PATCH 19/26] Adding review comment --- .../hudson/plugins/ec2/EC2AbstractSlave.java | 34 ++- .../hudson/plugins/ec2/EC2OndemandSlave.java | 23 +- .../hudson/plugins/ec2/SlaveTemplate.java | 201 ++++++++++++------ .../plugins/ec2/util/EC2AgentConfig.java | 16 ++ .../plugins/ec2/EC2AbstractSlaveTest.java | 7 +- .../plugins/ec2/EC2OndemandSlaveTest.java | 4 +- .../plugins/ec2/EC2RetentionStrategyTest.java | 124 +++++------ .../plugins/ec2/EC2SlaveMonitorTest.java | 20 +- .../hudson/plugins/ec2/SlaveTemplateTest.java | 120 ++++++----- .../plugins/ec2/SlaveTemplateUnitTest.java | 6 +- .../plugins/ec2/TemplateLabelsTest.java | 2 +- .../SshHostKeyVerificationStrategyTest.java | 4 +- .../ec2/util/EC2AgentFactoryMockImpl.java | 18 +- 13 files changed, 356 insertions(+), 223 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java index bfee63f15..d7815dfe3 100644 --- a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java @@ -23,7 +23,6 @@ */ package hudson.plugins.ec2; -import com.amazonaws.services.ec2.model.*; import hudson.Util; import hudson.model.Computer; import hudson.model.Descriptor; @@ -58,6 +57,18 @@ import com.amazonaws.AmazonClientException; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.services.ec2.AmazonEC2; +import com.amazonaws.services.ec2.model.AvailabilityZone; +import com.amazonaws.services.ec2.model.CreateTagsRequest; +import com.amazonaws.services.ec2.model.DeleteTagsRequest; +import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult; +import com.amazonaws.services.ec2.model.Instance; +import com.amazonaws.services.ec2.model.InstanceBlockDeviceMapping; +import com.amazonaws.services.ec2.model.InstanceStateName; +import com.amazonaws.services.ec2.model.InstanceType; +import com.amazonaws.services.ec2.model.StopInstancesRequest; +import com.amazonaws.services.ec2.model.Tag; +import com.amazonaws.services.ec2.model.TerminateInstancesRequest; +import com.amazonaws.services.ec2.model.Tenancy; /** * Slave running on EC2. @@ -82,11 +93,16 @@ public abstract class EC2AbstractSlave extends Slave { public final String jvmopts; // e.g. -Xmx1g public final boolean stopOnTerminate; public final String idleTerminationMinutes; + + @Deprecated + public transient boolean useDedicatedTenancy; + public boolean isConnected = false; public List tags; public final String cloudName; public AMITypeData amiType; public int maxTotalUses; + public final Tenancy tenancy; private String instanceType; // Temporary stuff that is obtained live from EC2 @@ -129,8 +145,6 @@ public abstract class EC2AbstractSlave extends Slave { public static final String TEST_ZONE = "testZone"; - public final Tenancy tenancy; - public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) throws FormException, IOException { @@ -151,19 +165,27 @@ public EC2AbstractSlave(String name, String instanceId, String templateDescripti this.idleTerminationMinutes = idleTerminationMinutes; this.tags = tags; this.usePrivateDnsName = connectionStrategy == ConnectionStrategy.PRIVATE_DNS; + this.useDedicatedTenancy = tenancy == Tenancy.Dedicated; this.cloudName = cloudName; this.launchTimeout = launchTimeout; this.amiType = amiType; this.maxTotalUses = maxTotalUses; - this.tenancy = tenancy == null ? Tenancy.Default : tenancy; + this.tenancy = tenancy != null ? tenancy : Tenancy.Default; readResolve(); fetchLiveInstanceData(true); } @Deprecated - public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean usePrivateDnsName, int launchTimeout, AMITypeData amiType, Tenancy tenancy) + public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) + throws FormException, IOException { + + this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, Tenancy.Default); + } + + @Deprecated + public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1, tenancy); + this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, useDedicatedTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); } @Override diff --git a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java index 20781d965..e328db3b7 100644 --- a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java @@ -36,39 +36,44 @@ public class EC2OndemandSlave extends EC2AbstractSlave { @Deprecated public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, launchTimeout, amiType, Tenancy.Default); + this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, launchTimeout, amiType); } @Deprecated - public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, int launchTimeout, AMITypeData amiType, Tenancy tenancy) + public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) throws FormException, IOException { - this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, launchTimeout, amiType, tenancy); + this(instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, false, useDedicatedTenancy, launchTimeout, amiType); } @Deprecated - public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean usePrivateDnsName, int launchTimeout, AMITypeData amiType, Tenancy tenancy) + public EC2OndemandSlave(String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) throws FormException, IOException { + this(templateDescription + " (" + instanceId + ")", instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, Collections.emptyList(), remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, useDedicatedTenancy, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1); + } - this(templateDescription + " (" + instanceId + ")", instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, Collections.emptyList(), remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, launchTimeout, amiType, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, false, false), -1,tenancy ); + @Deprecated + public EC2OndemandSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) + throws FormException, IOException { + + this(name, instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, Tenancy.Default); } @DataBoundConstructor - public EC2OndemandSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) + public EC2OndemandSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) throws FormException, IOException { super(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, amiType.isWindows() ? new EC2WindowsLauncher() - : new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, tenancy); + : new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, tenancy); this.publicDNS = publicDNS; this.privateDNS = privateDNS; } - /** * Constructor for debugging. */ public EC2OndemandSlave(String instanceId) throws FormException, IOException { - this(instanceId, instanceId, "debug", "/tmp/hudson", 1, "debug", Mode.NORMAL, "", "/tmp", Collections.emptyList(), null, null, false, null, "Fake public", "Fake private", null, null, 0, new UnixData(null, null, null, null), ConnectionStrategy.PRIVATE_IP, -1, Tenancy.Default); + this(instanceId, instanceId, "debug", "/tmp/hudson", 1, "debug", Mode.NORMAL, "", "/tmp", Collections.emptyList(), null, null, false, null, "Fake public", "Fake private", null, null, false, 0, new UnixData(null, null, null, null), ConnectionStrategy.PRIVATE_IP, -1); } /** diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index c379127c8..d96887e83 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -22,7 +22,51 @@ import com.amazonaws.AmazonServiceException; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.services.ec2.AmazonEC2; -import com.amazonaws.services.ec2.model.*; +import com.amazonaws.services.ec2.model.AmazonEC2Exception; +import com.amazonaws.services.ec2.model.AvailabilityZone; +import com.amazonaws.services.ec2.model.BlockDeviceMapping; +import com.amazonaws.services.ec2.model.CancelSpotInstanceRequestsRequest; +import com.amazonaws.services.ec2.model.CreateTagsRequest; +import com.amazonaws.services.ec2.model.CreditSpecificationRequest; +import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult; +import com.amazonaws.services.ec2.model.DescribeImagesRequest; +import com.amazonaws.services.ec2.model.DescribeInstancesRequest; +import com.amazonaws.services.ec2.model.DescribeInstancesResult; +import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest; +import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; +import com.amazonaws.services.ec2.model.DescribeSpotInstanceRequestsRequest; +import com.amazonaws.services.ec2.model.DescribeSpotPriceHistoryRequest; +import com.amazonaws.services.ec2.model.DescribeSpotPriceHistoryResult; +import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; +import com.amazonaws.services.ec2.model.DescribeSubnetsResult; +import com.amazonaws.services.ec2.model.Filter; +import com.amazonaws.services.ec2.model.IamInstanceProfileSpecification; +import com.amazonaws.services.ec2.model.Image; +import com.amazonaws.services.ec2.model.Instance; +import com.amazonaws.services.ec2.model.InstanceMarketOptionsRequest; +import com.amazonaws.services.ec2.model.InstanceNetworkInterfaceSpecification; +import com.amazonaws.services.ec2.model.InstanceStateName; +import com.amazonaws.services.ec2.model.InstanceType; +import com.amazonaws.services.ec2.model.KeyPair; +import com.amazonaws.services.ec2.model.LaunchSpecification; +import com.amazonaws.services.ec2.model.MarketType; +import com.amazonaws.services.ec2.model.Placement; +import com.amazonaws.services.ec2.model.RequestSpotInstancesRequest; +import com.amazonaws.services.ec2.model.RequestSpotInstancesResult; +import com.amazonaws.services.ec2.model.Reservation; +import com.amazonaws.services.ec2.model.ResourceType; +import com.amazonaws.services.ec2.model.RunInstancesRequest; +import com.amazonaws.services.ec2.model.SecurityGroup; +import com.amazonaws.services.ec2.model.ShutdownBehavior; +import com.amazonaws.services.ec2.model.SpotInstanceRequest; +import com.amazonaws.services.ec2.model.SpotMarketOptions; +import com.amazonaws.services.ec2.model.SpotPlacement; +import com.amazonaws.services.ec2.model.SpotPrice; +import com.amazonaws.services.ec2.model.StartInstancesRequest; +import com.amazonaws.services.ec2.model.StartInstancesResult; +import com.amazonaws.services.ec2.model.Subnet; +import com.amazonaws.services.ec2.model.Tag; +import com.amazonaws.services.ec2.model.TagSpecification; import hudson.Extension; import hudson.Util; import hudson.XmlFile; @@ -152,6 +196,7 @@ import com.amazonaws.services.ec2.model.Subnet; import com.amazonaws.services.ec2.model.Tag; import com.amazonaws.services.ec2.model.TagSpecification; +import com.amazonaws.services.ec2.model.Tenancy; import hudson.Extension; import hudson.Util; @@ -304,6 +349,9 @@ public class SlaveTemplate implements Describable { @Deprecated public boolean connectUsingPublicIp; + @Deprecated + public transient boolean useDedicatedTenancy; + @DataBoundConstructor public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, @@ -345,6 +393,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri this.idleTerminationMinutes = idleTerminationMinutes; this.associatePublicIp = associatePublicIp; this.connectionStrategy = connectionStrategy == null ? ConnectionStrategy.PRIVATE_IP : connectionStrategy; + this.useDedicatedTenancy = tenancy == Tenancy.Dedicated; this.connectBySSHProcess = connectBySSHProcess; this.maxTotalUses = maxTotalUses; this.nodeProperties = new DescribableList<>(Saveable.NOOP, Util.fixNull(nodeProperties)); @@ -376,7 +425,8 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri this.t2Unlimited = t2Unlimited; this.hostKeyVerificationStrategy = hostKeyVerificationStrategy != null ? hostKeyVerificationStrategy : HostKeyVerificationStrategyEnum.CHECK_NEW_SOFT; - this.tenancy = tenancy == null ? Tenancy.Default : tenancy; + this.tenancy = tenancy != null ? tenancy : Tenancy.Default; + readResolve(); // initialize } @@ -386,10 +436,10 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, - List> nodeProperties, Tenancy tenancy) { + List> nodeProperties, HostKeyVerificationStrategyEnum hostKeyVerificationStrategy) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, @@ -398,39 +448,60 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri useEphemeralDevices, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, - nodeProperties, null, tenancy); + nodeProperties, hostKeyVerificationStrategy, Tenancy.Default); } @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses,List> nodeProperties, Tenancy tenancy ) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + int minimumNumberOfSpareInstances, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, + List> nodeProperties) { + this(ami, zone, spotConfig, securityGroups, remoteFS, + type, ebsOptimized, labelString, mode, description, initScript, + tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, + stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, + minimumNumberOfSpareInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, + useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, + customDeviceMapping, connectBySSHProcess, monitoring, + t2Unlimited, connectionStrategy, maxTotalUses, + nodeProperties, null); + } + + @Deprecated + public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses,List> nodeProperties ) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, launchTimeoutStr, associatePublicIp, customDeviceMapping, - connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, nodeProperties, tenancy); + useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, + connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, nodeProperties); } @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, - String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, int minimumNumberOfInstances, + String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, minimumNumberOfInstances, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, - useEphemeralDevices, launchTimeoutStr, associatePublicIp, customDeviceMapping, - connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, Collections.emptyList(), tenancy); + useEphemeralDevices, useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, + connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, Collections.emptyList()); } @Deprecated @@ -439,84 +510,84 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring, - boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) { + boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, - tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, - idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, - monitoring, t2Unlimited, connectionStrategy, maxTotalUses, tenancy); + tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, + idleTerminationMinutes, 0, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + monitoring, t2Unlimited, connectionStrategy, maxTotalUses); } @Deprecated public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, boolean monitoring, - boolean t2Unlimited, Tenancy tenancy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, boolean monitoring, + boolean t2Unlimited) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, - monitoring, t2Unlimited, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, connectUsingPublicIp, associatePublicIp), -1, tenancy); + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + monitoring, t2Unlimited, ConnectionStrategy.backwardsCompatible(usePrivateDnsName, connectUsingPublicIp, associatePublicIp), -1); } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, - boolean useEphemeralDevices, String launchTimeoutStr, boolean associatePublicIp, - String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp, Tenancy tenancy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination, + boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, + String customDeviceMapping, boolean connectBySSHProcess, boolean connectUsingPublicIp) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, deleteRootOnTermination, useEphemeralDevices, - launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, - connectUsingPublicIp, false, false, tenancy); + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, + connectUsingPublicIp, false, false); } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, - boolean connectBySSHProcess, Tenancy tenancy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, + boolean connectBySSHProcess) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, false, useEphemeralDevices, - launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, false, tenancy); + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, false); } public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, - String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, - boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping, Tenancy tenancy) { + InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript, + String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts, + boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp, String customDeviceMapping) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, amiType, jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, useEphemeralDevices, - launchTimeoutStr, associatePublicIp, customDeviceMapping, false, tenancy); + useDedicatedTenancy, launchTimeoutStr, associatePublicIp, customDeviceMapping, false); } /** * Backward compatible constructor for reloading previous version data */ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS, - String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, - String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, - String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, - boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, - String launchTimeoutStr) { + String sshPort, InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, + String initScript, String tmpDir, String userData, String numExecutors, String remoteAdmin, String rootCommandPrefix, + String slaveCommandPrefix, String slaveCommandSuffix, String jvmopts, boolean stopOnTerminate, String subnetId, List tags, String idleTerminationMinutes, + boolean usePrivateDnsName, String instanceCapStr, String iamInstanceProfile, boolean useEphemeralDevices, + String launchTimeoutStr) { this(ami, zone, spotConfig, securityGroups, remoteFS, type, ebsOptimized, labelString, mode, description, initScript, tmpDir, userData, numExecutors, remoteAdmin, new UnixData(rootCommandPrefix, slaveCommandPrefix, slaveCommandSuffix, sshPort), jvmopts, stopOnTerminate, subnetId, tags, idleTerminationMinutes, usePrivateDnsName, instanceCapStr, iamInstanceProfile, - useEphemeralDevices, launchTimeoutStr, false, null, null); + useEphemeralDevices, false, launchTimeoutStr, false, null); } public boolean isConnectBySSHProcess() { diff --git a/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java b/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java index 0e4febbef..ef97b3f1f 100644 --- a/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java +++ b/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java @@ -58,6 +58,8 @@ public static class OnDemand extends EC2AgentConfig { final String publicDNS; final String privateDNS; final Tenancy tenancy; + @Deprecated + final boolean useDedicatedTenancy; private OnDemand(OnDemandBuilder builder) { super(builder); @@ -66,6 +68,7 @@ private OnDemand(OnDemandBuilder builder) { this.publicDNS = builder.getPublicDNS(); this.privateDNS = builder.getPrivateDNS(); this.tenancy = builder.getTenancyAttribute(); + this.useDedicatedTenancy = builder.isUseDedicatedTenancy(); } } @@ -206,6 +209,8 @@ public static class OnDemandBuilder extends Builder { private String publicDNS; private String privateDNS; private Tenancy tenancy; + @Deprecated + private boolean useDedicatedTenancy; public OnDemandBuilder withInstanceId(String instanceId) { this.instanceId = instanceId; @@ -243,6 +248,17 @@ public String getPrivateDNS() { return privateDNS; } + @Deprecated + public OnDemandBuilder withUseDedicatedTenancy(boolean useDedicatedTenancy) { + this.useDedicatedTenancy = useDedicatedTenancy; + return this; + } + + @Deprecated + public boolean isUseDedicatedTenancy() { + return useDedicatedTenancy; + } + public OnDemandBuilder withTenancyAttribute( Tenancy tenancy){ this.tenancy = tenancy; return this; diff --git a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java index 6dc0abfa2..47c113796 100644 --- a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java @@ -1,5 +1,6 @@ package hudson.plugins.ec2; +import com.amazonaws.services.ec2.model.Tenancy; import hudson.slaves.NodeProperty; import hudson.model.Node; import java.util.ArrayList; @@ -21,7 +22,7 @@ public class EC2AbstractSlaveTest { @Test public void testGetLaunchTimeoutInMillisShouldNotOverflow() throws Exception { - EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "cloud", Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, -1,null) { + EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, -1) { @Override public void terminate() { // To change body of implemented methods use File | Settings | @@ -41,12 +42,12 @@ public String getEc2Type() { @Test public void testMaxUsesBackwardCompat() throws Exception { final String description = "description"; - SlaveTemplate orig = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, null, "", true, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1,null); + SlaveTemplate orig = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1); List templates = new ArrayList<>(); templates.add(orig); AmazonEC2Cloud ac = new AmazonEC2Cloud("us-east-1", false, "abc", "us-east-1", "ghi", "3", templates, null, null); r.jenkins.clouds.add(ac); - EC2AbstractSlave slave = new EC2AbstractSlave("name", "", description, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "ec2-us-east-1", Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, 0,null) { + EC2AbstractSlave slave = new EC2AbstractSlave("name", "", description, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "root", "jvm", false, "idle", null, "ec2-us-east-1", false, Integer.MAX_VALUE, new UnixData("remote", null, null, "22"), ConnectionStrategy.PRIVATE_IP, 0) { @Override public void terminate() { } diff --git a/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java b/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java index d80838bea..e75aaf88c 100644 --- a/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2OndemandSlaveTest.java @@ -16,10 +16,10 @@ public class EC2OndemandSlaveTest { @Test public void testSpecifyMode() throws Exception { - EC2OndemandSlave slaveNormal = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.NORMAL, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1,null); + EC2OndemandSlave slaveNormal = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.NORMAL, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", false, 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1); assertEquals(Node.Mode.NORMAL, slaveNormal.getMode()); - EC2OndemandSlave slaveExclusive = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.EXCLUSIVE, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1,null); + EC2OndemandSlave slaveExclusive = new EC2OndemandSlave("name", "instanceId", "description", "remoteFS", 1, "labelString", Node.Mode.EXCLUSIVE, "initScript", "tmpDir", Collections.emptyList(), "remoteAdmin", "jvmopts", false, "30", "publicDNS", "privateDNS", Collections.emptyList(), "cloudName", false, 0, new UnixData("a", null, null, "b"), ConnectionStrategy.PRIVATE_IP, -1); assertEquals(Node.Mode.EXCLUSIVE, slaveExclusive.getMode()); } diff --git a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java index dc7c674cc..b5cd19b17 100644 --- a/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2RetentionStrategyTest.java @@ -89,7 +89,7 @@ private EC2Computer computerWithIdleTime(final int minutes, final int seconds) t * the computer returns the value established. */ private EC2Computer computerWithIdleTime(final int minutes, final int seconds, final Boolean isOffline, final Boolean isConnecting) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1,null) { + final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { @Override public void terminate() { } @@ -128,7 +128,7 @@ public InstanceState getState() { @Override public SlaveTemplate getSlaveTemplate() { - return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, "", false, "",null); + return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); } @Override @@ -173,7 +173,7 @@ public void testOnUsageCountRetention() throws Exception { } private EC2Computer computerWithUsageLimit(final int usageLimit) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, usageLimit,null) { + final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, usageLimit) { @Override public void terminate() { terminateCalled.set(true); @@ -268,20 +268,20 @@ public void testInternalCheckRespectsWait() throws Exception { public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); SSHCredentialHelper.assureSshCredentialAvailableThroughCredentialProviders("ghi"); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", null, "ghi", "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -292,9 +292,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check too assertEquals(2, computers.size()); @@ -304,9 +304,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { cloud.provision(template, 1); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have three slaves before any checking assertEquals(3, computers.size()); @@ -316,9 +316,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check assertEquals(2, computers.size()); @@ -328,9 +328,9 @@ public void testRetentionDespiteIdleWithMinimumInstances() throws Exception { @Test public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -352,15 +352,15 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); SSHCredentialHelper.assureSshCredentialAvailableThroughCredentialProviders("ghi"); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", null, "ghi", "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -371,9 +371,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check too assertEquals(2, computers.size()); @@ -384,9 +384,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRange() throws @Test public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -408,15 +408,15 @@ public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Excep MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", PrivateKeyHelper.generate(), "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have zero slaves assertEquals(0, computers.size()); @@ -425,9 +425,9 @@ public void testRetentionIdleWithMinimumInstanceInactiveTimeRange() throws Excep @Test public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidnight() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("15:00"); @@ -449,15 +449,15 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni MinimumInstanceChecker.clock = Clock.fixed(localDateTime.atZone(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); SSHCredentialHelper.assureSshCredentialAvailableThroughCredentialProviders("ghi"); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", null, "ghi", "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -468,9 +468,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves after check too assertEquals(2, computers.size()); @@ -480,9 +480,9 @@ public void testRetentionDespiteIdleWithMinimumInstanceActiveTimeRangeAfterMidni @Test public void testRetentionStopsAfterActiveRangeEnds() throws Exception { SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", - InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, - "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, "", false, "", false, false, - true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList(),null); + InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, + "-Xmx1g", false, "subnet 456", null, null, 2, 0, "10", null, true, true, false, "", false, "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, Collections.emptyList()); MinimumNumberOfInstancesTimeRangeConfig minimumNumberOfInstancesTimeRangeConfig = new MinimumNumberOfInstancesTimeRangeConfig(); minimumNumberOfInstancesTimeRangeConfig.setMinimumNoInstancesActiveTimeRangeFrom("11:00"); @@ -504,15 +504,15 @@ public void testRetentionStopsAfterActiveRangeEnds() throws Exception { SSHCredentialHelper.assureSshCredentialAvailableThroughCredentialProviders("ghi"); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", null, "ghi", "3", - Collections - .singletonList(template), "roleArn", "roleSessionName"); + Collections + .singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); List computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have two slaves before any checking assertEquals(2, computers.size()); @@ -527,9 +527,9 @@ public void testRetentionStopsAfterActiveRangeEnds() throws Exception { checkRetentionStrategy(rs, computers.get(0)); computers = Arrays.stream(r.jenkins.getComputers()) - .filter(computer -> computer instanceof EC2Computer) - .map(computer -> (EC2Computer) computer) - .collect(Collectors.toList()); + .filter(computer -> computer instanceof EC2Computer) + .map(computer -> (EC2Computer) computer) + .collect(Collectors.toList()); // Should have 1 slaves after check assertEquals(1, computers.size()); @@ -541,4 +541,4 @@ private static void checkRetentionStrategy(EC2RetentionStrategy rs, EC2Computer EC2AbstractSlave node = c.getNode(); assertTrue(node.terminateScheduled.await(10, TimeUnit.SECONDS)); } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java b/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java index 6bb2050d0..469b3a39b 100644 --- a/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2SlaveMonitorTest.java @@ -29,7 +29,7 @@ public void init(){ @Test public void testMinimumNumberOfInstances() throws Exception { - SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0,null); + SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0); SSHCredentialHelper.assureSshCredentialAvailableThroughCredentialProviders("ghi"); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", null, "ghi", "3", Collections.singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); @@ -42,18 +42,18 @@ public void testMinimumNumberOfInstances() throws Exception { public void testMinimumNumberOfSpareInstances() throws Exception { // Arguments split onto newlines matching the construtor definition to make figuring which is which easier. SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "defaultsecgroup", "remotefs", - InstanceType.M1Large, false, "label", Node.Mode.NORMAL, "description", "init script", - "tmpdir", "userdata", "10", "remoteadmin", null, "-Xmx1g", - false, "subnet 456", null, "0", 0, - 2, null, null, true, - true, "",false, "", false, - false, - true, ConnectionStrategy.PRIVATE_IP, 0, - null,null); + InstanceType.M1Large, false, "label", Node.Mode.NORMAL, "description", "init script", + "tmpdir", "userdata", "10", "remoteadmin", null, "-Xmx1g", + false, "subnet 456", null, "0", 0, + 2, null, null, true, + true, false, "", false, + "", false, false, + true, ConnectionStrategy.PRIVATE_IP, 0, + null); SSHCredentialHelper.assureSshCredentialAvailableThroughCredentialProviders("ghi"); AmazonEC2Cloud cloud = new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1", null, "ghi", "3", Collections.singletonList(template), "roleArn", "roleSessionName"); r.jenkins.clouds.add(cloud); r.configRoundtrip(); Assert.assertEquals(2, Arrays.stream(Jenkins.get().getComputers()).filter(computer -> computer instanceof EC2Computer).count()); } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java index 940855a3c..49e6a3b9e 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java @@ -24,31 +24,13 @@ package hudson.plugins.ec2; import com.amazonaws.services.ec2.AmazonEC2; -import com.amazonaws.services.ec2.model.DescribeImagesRequest; -import com.amazonaws.services.ec2.model.DescribeImagesResult; -import com.amazonaws.services.ec2.model.DescribeInstancesRequest; -import com.amazonaws.services.ec2.model.DescribeInstancesResult; -import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest; -import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; -import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; -import com.amazonaws.services.ec2.model.DescribeSubnetsResult; -import com.amazonaws.services.ec2.model.IamInstanceProfile; -import com.amazonaws.services.ec2.model.Image; -import com.amazonaws.services.ec2.model.Instance; -import com.amazonaws.services.ec2.model.InstanceNetworkInterfaceSpecification; -import com.amazonaws.services.ec2.model.InstanceState; -import com.amazonaws.services.ec2.model.InstanceType; -import com.amazonaws.services.ec2.model.KeyPair; -import com.amazonaws.services.ec2.model.RunInstancesRequest; -import com.amazonaws.services.ec2.model.RunInstancesResult; -import com.amazonaws.services.ec2.model.SecurityGroup; -import com.amazonaws.services.ec2.model.Subnet; +import com.amazonaws.services.ec2.model.*; +import com.amazonaws.services.ec2.model.InstanceState; import hudson.Util; import hudson.model.Node; import hudson.plugins.ec2.SlaveTemplate.ProvisionOptions; import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig; -import com.amazonaws.services.ec2.model.Reservation; import hudson.plugins.ec2.util.PrivateKeyHelper; import jenkins.model.Jenkins; @@ -98,7 +80,7 @@ public void testConfigRoundtrip() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null,false, null, "", true, "", false, "", null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -108,7 +90,7 @@ public void testConfigRoundtrip() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,connectionStrategy,hostKeyVerificationStrategy,tenancy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); } @Test @@ -122,7 +104,7 @@ public void testConfigRoundtripWithCustomConnectionStrategy() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, "", "", false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1,null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1); List templates = new ArrayList(); templates.add(orig); @@ -132,7 +114,7 @@ public void testConfigRoundtripWithCustomConnectionStrategy() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,connectionStrategy,hostKeyVerificationStrategy,tenancy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); } @Test @@ -142,7 +124,7 @@ public void testDefaultSSHHostKeyVerificationStrategy() throws Exception { List tags = new ArrayList(); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null,null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null); List templates = new ArrayList(); templates.add(orig); @@ -152,7 +134,7 @@ public void testDefaultSSHHostKeyVerificationStrategy() throws Exception { r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,connectionStrategy,hostKeyVerificationStrategy,tenancy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); // For already existing strategies, the default is this one assertEquals(HostKeyVerificationStrategyEnum.CHECK_NEW_SOFT, received.getHostKeyVerificationStrategy()); } @@ -171,7 +153,7 @@ public void testConfigRoundtripWithCustomSSHHostKeyVerificationStrategy() throws // We check this one is set final HostKeyVerificationStrategyEnum STRATEGY_TO_CHECK = HostKeyVerificationStrategyEnum.OFF; - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, STRATEGY_TO_CHECK,null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, 0, 0, null, "", true, false, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, STRATEGY_TO_CHECK); List templates = new ArrayList(); templates.add(orig); @@ -181,7 +163,7 @@ public void testConfigRoundtripWithCustomSSHHostKeyVerificationStrategy() throws r.submit(r.createWebClient().goTo("configure").getFormByName("config")); SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); - r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,connectionStrategy,hostKeyVerificationStrategy,tenancy"); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,useDedicatedTenancy,connectionStrategy,hostKeyVerificationStrategy"); assertEquals(STRATEGY_TO_CHECK, received.getHostKeyVerificationStrategy()); } @@ -208,7 +190,7 @@ public void testConfigWithSpotBidPrice() throws Exception { spotConfig.setFallbackToOndemand(false); spotConfig.setSpotBlockReservationDuration(0); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null,false, null, "", false,"", false, "",null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -239,7 +221,7 @@ public void testSpotConfigWithoutBidPrice() throws Exception { SpotConfiguration spotConfig = new SpotConfiguration(false); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, "", null, false, "", false, "",null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -273,7 +255,7 @@ public void testSpotConfigWithFallback() throws Exception { spotConfig.setFallbackToOndemand(true); spotConfig.setSpotBlockReservationDuration(0); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null,false, "", null, true, "", false, "", null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, true, null, "", false, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -301,7 +283,7 @@ public void testConfigRoundtripIamRole() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null,false, null, "iamInstanceProfile", false, "", false, "",null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "iamInstanceProfile", false, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -316,13 +298,13 @@ public void testConfigRoundtripIamRole() throws Exception { @Test public void testNullTimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, null, false, "",null); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, false, ""); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testUpdateAmi() { - SlaveTemplate st = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, "0", false, "",null); + SlaveTemplate st = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "0", false, ""); assertEquals("ami1", st.getAmi()); st.setAmi("ami2"); assertEquals("ami2", st.getAmi()); @@ -332,37 +314,37 @@ public void testUpdateAmi() { @Test public void test0TimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, "0", false, "",null); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "0", false, ""); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testNegativeTimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, "-1", false, "",null); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "-1", false, ""); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testNonNumericTimeoutShouldReturnMaxInt() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, "NotANumber", false, "",null); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, "NotANumber", false, ""); assertEquals(Integer.MAX_VALUE, st.getLaunchTimeout()); } @Test public void testAssociatePublicIpSetting() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, null, true, "",null); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, true, ""); assertEquals(true, st.getAssociatePublicIp()); } @Test public void testConnectUsingPublicIpSetting() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, true, "", false, true,null); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, false, null, true, "", false, true); assertEquals(st.connectionStrategy, ConnectionStrategy.PUBLIC_IP); } @Test public void testConnectUsingPublicIpSettingWithDefaultSetting() { - SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, null, true, "",null); + SlaveTemplate st = new SlaveTemplate("", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "iamInstanceProfile", false, false, null, true, ""); assertEquals(st.connectionStrategy, ConnectionStrategy.PUBLIC_IP); } @@ -385,7 +367,7 @@ public void testWindowsConfigRoundTrip() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new WindowsData("password", false, ""), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, "", false, "",null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new WindowsData("password", false, ""), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -411,7 +393,7 @@ public void testUnixConfigRoundTrip() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new UnixData("sudo", null, null, "22"), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, "", false, "",null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "rrr", new UnixData("sudo", null, null, "22"), "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, ""); List templates = new ArrayList(); templates.add(orig); @@ -426,7 +408,7 @@ public void testUnixConfigRoundTrip() throws Exception { @Test public void testChooseSubnetId() throws Exception { - SlaveTemplate slaveTemplate = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null,false, null, "", false, "", false, "",null); + SlaveTemplate slaveTemplate = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); String subnet1 = slaveTemplate.chooseSubnetId(); String subnet2 = slaveTemplate.chooseSubnetId(); @@ -440,7 +422,7 @@ public void testChooseSubnetId() throws Exception { @Issue("JENKINS-59460") @Test public void testConnectionStrategyDeprecatedFieldsAreExported() { - SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", Collections.singletonList(new EC2Tag("name1", "value1")), null, false, null, "", true, "", false, "",null); + SlaveTemplate template = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", Collections.singletonList(new EC2Tag("name1", "value1")), null, false, null, "", true, false, "", false, ""); String exported = Jenkins.XSTREAM.toXML(template); assertThat(exported, containsString("usePrivateDnsName")); @@ -465,7 +447,7 @@ public void testMinimumNumberOfInstancesActiveRangeConfig() throws Exception { spotConfig.setSpotMaxBidPrice("22"); spotConfig.setFallbackToOndemand(true); spotConfig.setSpotBlockReservationDuration(1); - SlaveTemplate slaveTemplate = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0,null); + SlaveTemplate slaveTemplate = new SlaveTemplate("ami1", EC2AbstractSlave.TEST_ZONE, spotConfig, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 2, null, null, true, true, false, "", false, "", false, false, true, ConnectionStrategy.PRIVATE_IP, 0); slaveTemplate.setMinimumNumberOfInstancesTimeRangeConfig(minimumNumberOfInstancesTimeRangeConfig); List templates = new ArrayList(); @@ -484,8 +466,8 @@ public void testMinimumNumberOfInstancesActiveRangeConfig() throws Exception { Assert.assertEquals(true, stored.getMinimumNoInstancesActiveTimeRangeDays().get("tuesday")); } - @Test - public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { + @Test + public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { boolean associatePublicIp = false; String ami = "ami1"; String description = "foo ami"; @@ -499,8 +481,8 @@ public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, "", associatePublicIp, "",null); - SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, "", associatePublicIp, "",null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); + SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); List templates = new ArrayList(); templates.add(orig); @@ -525,10 +507,10 @@ public void provisionOndemandSetsAwsNetworkingOnEc2Request() throws Exception { assertEquals(actualRequest.getSecurityGroups(), Stream.of(securityGroups).collect(Collectors.toList())); } } - } + } - @Test - public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Exception { + @Test + public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Exception { boolean associatePublicIp = true; String ami = "ami1"; String description = "foo ami"; @@ -542,8 +524,8 @@ public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Except tags.add(tag1); tags.add(tag2); - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, "", associatePublicIp, "",null); - SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, "", associatePublicIp, "",null); + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, subnetId, tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); + SlaveTemplate noSubnet = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, securityGroups, "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "", tags, null, false, null, iamInstanceProfile, true, false, "", associatePublicIp, ""); List templates = new ArrayList(); templates.add(orig); @@ -565,9 +547,9 @@ public void provisionOndemandSetsAwsNetworkingOnNetworkInterface() throws Except assertEquals(actualRequest.getSecurityGroupIds(), Collections.emptyList()); assertEquals(actualRequest.getSecurityGroups(), Collections.emptyList()); } - } + } - private AmazonEC2 setupTestForProvisioning(SlaveTemplate template) throws Exception { + private AmazonEC2 setupTestForProvisioning(SlaveTemplate template) throws Exception { AmazonEC2Cloud mockedCloud = mock(AmazonEC2Cloud.class); AmazonEC2 mockedEC2 = mock(AmazonEC2.class); EC2PrivateKey mockedPrivateKey = mock(EC2PrivateKey.class); @@ -619,5 +601,29 @@ private AmazonEC2 setupTestForProvisioning(SlaveTemplate template) throws Except when(mockedEC2.runInstances(any(RunInstancesRequest.class))).thenReturn(mockedResult); return mockedEC2; + } + + @Test + public void testTenancy() throws Exception { + String ami = "ami1"; + String description = "foo ami"; + + EC2Tag tag1 = new EC2Tag("name1", "value1"); + EC2Tag tag2 = new EC2Tag("name2", "value2"); + List tags = new ArrayList(); + tags.add(tag1); + tags.add(tag2); + + SlaveTemplate orig = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 0, 0, null, "", true, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, null, Tenancy.Default); + + List templates = new ArrayList(); + templates.add(orig); + + AmazonEC2Cloud ac = new AmazonEC2Cloud("us-east-1", false, "abc", "us-east-1", "ghi", "3", templates, null, null); + r.jenkins.clouds.add(ac); + + r.submit(r.createWebClient().goTo("configure").getFormByName("config")); + SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,connectionStrategy,hostKeyVerificationStrategy,tenancy"); } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java index 36cb67936..f55b6f38d 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateUnitTest.java @@ -59,7 +59,7 @@ public CreateTagsResult createTags(com.amazonaws.services.ec2.model.CreateTagsRe tags.add(tag2); String instanceId = "123"; - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, "", false, "",null) { + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, "") { @Override protected Object readResolve() { return null; @@ -96,7 +96,7 @@ public CreateTagsResult createTags(com.amazonaws.services.ec2.model.CreateTagsRe tags.add(tag2); String instanceId = "123"; - SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, "", false, "",null) { + SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, "") { @Override protected Object readResolve() { return null; @@ -167,7 +167,7 @@ private void doTestMakeDescribeImagesRequest(SlaveTemplate template, @Test public void testMakeDescribeImagesRequest() throws Exception { - SlaveTemplate template = new SlaveTemplate(null, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "", true, "", false, "",null) { + SlaveTemplate template = new SlaveTemplate(null, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "foo", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, false, null, "", true, false, "", false, "") { @Override protected Object readResolve() { return null; diff --git a/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java b/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java index 8a6e13060..8acd5eeaa 100644 --- a/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java +++ b/src/test/java/hudson/plugins/ec2/TemplateLabelsTest.java @@ -56,7 +56,7 @@ private void setUpCloud(String label, Node.Mode mode) throws Exception { tags.add(tag1); tags.add(tag2); - SlaveTemplate template = new SlaveTemplate("ami", "foo", null, "default", "zone", InstanceType.M1Large, false, label, mode, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", true, "subnet 456", tags, null, false, null, "", false, null, false, "",null); + SlaveTemplate template = new SlaveTemplate("ami", "foo", null, "default", "zone", InstanceType.M1Large, false, label, mode, "foo ami", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", true, "subnet 456", tags, null, false, null, "", false, false, null, false, ""); List templates = new ArrayList(); templates.add(template); diff --git a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java index f3493d41f..c1dce8437 100644 --- a/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java +++ b/src/test/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationStrategyTest.java @@ -337,7 +337,7 @@ public MockEC2Computer(EC2AbstractSlave slave) { // Create a computer private static MockEC2Computer createComputer(String suffix) throws Exception { - final EC2AbstractSlave slave = new EC2AbstractSlave(COMPUTER_NAME + suffix, "id" + suffix, "description" + suffix, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1,null) { + final EC2AbstractSlave slave = new EC2AbstractSlave(COMPUTER_NAME + suffix, "id" + suffix, "description" + suffix, "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList>(), "remote", "jvm", false, "idle", null, "cloud", false, Integer.MAX_VALUE, null, ConnectionStrategy.PRIVATE_IP, -1) { @Override public void terminate() { } @@ -368,7 +368,7 @@ public EC2AbstractSlave getNode() { @Override public SlaveTemplate getSlaveTemplate() { - return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, false, "", "", false, "", false, "",null); + return new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, "AMI description", "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet-123 subnet-456", null, null, true, null, "", false, false, "", false, ""); } } diff --git a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java index c3ca39838..934527c32 100644 --- a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java +++ b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java @@ -4,8 +4,8 @@ import java.util.List; import com.amazonaws.AmazonClientException; - import com.amazonaws.services.ec2.model.Tenancy; + import hudson.Extension; import hudson.model.Computer; import hudson.model.Descriptor; @@ -15,6 +15,7 @@ @Extension public class EC2AgentFactoryMockImpl implements EC2AgentFactory { + @Override public EC2OndemandSlave createOnDemandAgent(EC2AgentConfig.OnDemand config) throws Descriptor.FormException, IOException { @@ -34,9 +35,20 @@ private MockEC2OndemandSlave(String name, String instanceId, String description, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, - List tags, String cloudName, int launchTimeout, + List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, - int maxTotalUses, Tenancy tenancy) + int maxTotalUses) + throws Descriptor.FormException, IOException { + this(name, instanceId, description, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses,Tenancy.Default); + } + + private MockEC2OndemandSlave(String name, String instanceId, String description, String remoteFS, + int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, + List> nodeProperties, String remoteAdmin, String jvmopts, + boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, + List tags, String cloudName, int launchTimeout, + AMITypeData amiType, ConnectionStrategy connectionStrategy, + int maxTotalUses, Tenancy tenancy) throws Descriptor.FormException, IOException { super(name, instanceId, description, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, tenancy); } From 5a6cd714dc12b7821c880f036d930dcc458066f8 Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Sat, 6 Mar 2021 23:53:24 +0530 Subject: [PATCH 20/26] Adding review comment --- .../hudson/plugins/ec2/EC2AbstractSlave.java | 322 +++++++++--------- .../hudson/plugins/ec2/SlaveTemplate.java | 149 ++++---- .../hudson/plugins/ec2/SlaveTemplateTest.java | 23 +- .../ec2/util/EC2AgentFactoryMockImpl.java | 1 - 4 files changed, 256 insertions(+), 239 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java index d7815dfe3..a99740db6 100644 --- a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java @@ -237,168 +237,168 @@ public EC2Cloud getCloud() { */ /* package */static int toNumExecutors(InstanceType it) { switch (it) { - case T1Micro: - return 1; - case M1Small: - return 1; - case M1Medium: - return 2; - case M3Medium: - return 2; - case T3Nano: - return 2; - case T3aNano: - return 2; - case T3Micro: - return 2; - case T3aMicro: - return 2; - case T3Small: - return 2; - case T3aSmall: - return 2; - case T3Medium: - return 2; - case T3aMedium: - return 2; - case A1Large: - return 2; - case T3Large: - return 3; - case T3aLarge: - return 3; - case M1Large: - return 4; - case M3Large: - return 4; - case M4Large: - return 4; - case M5Large: - return 4; - case M5aLarge: - return 4; - case T3Xlarge: - return 5; - case T3aXlarge: - return 5; - case A1Xlarge: - return 5; - case C1Medium: - return 5; - case M2Xlarge: - return 6; - case C3Large: - return 7; - case C4Large: - return 7; - case C5Large: - return 7; - case C5dLarge: - return 7; - case M1Xlarge: - return 8; - case T32xlarge: - return 10; - case T3a2xlarge: - return 10; - case A12xlarge: - return 10; - case M22xlarge: - return 13; - case M3Xlarge: - return 13; - case M4Xlarge: - return 13; - case M5Xlarge: - return 13; - case M5aXlarge: - return 13; - case A14xlarge: - return 14; - case C3Xlarge: - return 14; - case C4Xlarge: - return 14; - case C5Xlarge: - return 14; - case C5dXlarge: - return 14; - case C1Xlarge: - return 20; - case M24xlarge: - return 26; - case M32xlarge: - return 26; - case M42xlarge: - return 26; - case M52xlarge: - return 26; - case M5a2xlarge: - return 26; - case G22xlarge: - return 26; - case C32xlarge: - return 28; - case C42xlarge: - return 28; - case C52xlarge: - return 28; - case C5d2xlarge: - return 28; - case Cc14xlarge: - return 33; - case Cg14xlarge: - return 33; - case Hi14xlarge: - return 35; - case Hs18xlarge: - return 35; - case C34xlarge: - return 55; - case C44xlarge: - return 55; - case C54xlarge: - return 55; - case C5d4xlarge: - return 55; - case M44xlarge: - return 55; - case M54xlarge: - return 55; - case M5a4xlarge: - return 55; - case Cc28xlarge: - return 88; - case Cr18xlarge: - return 88; - case C38xlarge: - return 108; - case C48xlarge: - return 108; - case C59xlarge: - return 108; - case C5d9xlarge: - return 108; - case M410xlarge: - return 120; - case M512xlarge: - return 120; - case M5a12xlarge: - return 120; - case M416xlarge: - return 160; - case C518xlarge: - return 216; - case C5d18xlarge: - return 216; - case M524xlarge: - return 240; - case M5a24xlarge: - return 240; + case T1Micro: + return 1; + case M1Small: + return 1; + case M1Medium: + return 2; + case M3Medium: + return 2; + case T3Nano: + return 2; + case T3aNano: + return 2; + case T3Micro: + return 2; + case T3aMicro: + return 2; + case T3Small: + return 2; + case T3aSmall: + return 2; + case T3Medium: + return 2; + case T3aMedium: + return 2; + case A1Large: + return 2; + case T3Large: + return 3; + case T3aLarge: + return 3; + case M1Large: + return 4; + case M3Large: + return 4; + case M4Large: + return 4; + case M5Large: + return 4; + case M5aLarge: + return 4; + case T3Xlarge: + return 5; + case T3aXlarge: + return 5; + case A1Xlarge: + return 5; + case C1Medium: + return 5; + case M2Xlarge: + return 6; + case C3Large: + return 7; + case C4Large: + return 7; + case C5Large: + return 7; + case C5dLarge: + return 7; + case M1Xlarge: + return 8; + case T32xlarge: + return 10; + case T3a2xlarge: + return 10; + case A12xlarge: + return 10; + case M22xlarge: + return 13; + case M3Xlarge: + return 13; + case M4Xlarge: + return 13; + case M5Xlarge: + return 13; + case M5aXlarge: + return 13; + case A14xlarge: + return 14; + case C3Xlarge: + return 14; + case C4Xlarge: + return 14; + case C5Xlarge: + return 14; + case C5dXlarge: + return 14; + case C1Xlarge: + return 20; + case M24xlarge: + return 26; + case M32xlarge: + return 26; + case M42xlarge: + return 26; + case M52xlarge: + return 26; + case M5a2xlarge: + return 26; + case G22xlarge: + return 26; + case C32xlarge: + return 28; + case C42xlarge: + return 28; + case C52xlarge: + return 28; + case C5d2xlarge: + return 28; + case Cc14xlarge: + return 33; + case Cg14xlarge: + return 33; + case Hi14xlarge: + return 35; + case Hs18xlarge: + return 35; + case C34xlarge: + return 55; + case C44xlarge: + return 55; + case C54xlarge: + return 55; + case C5d4xlarge: + return 55; + case M44xlarge: + return 55; + case M54xlarge: + return 55; + case M5a4xlarge: + return 55; + case Cc28xlarge: + return 88; + case Cr18xlarge: + return 88; + case C38xlarge: + return 108; + case C48xlarge: + return 108; + case C59xlarge: + return 108; + case C5d9xlarge: + return 108; + case M410xlarge: + return 120; + case M512xlarge: + return 120; + case M5a12xlarge: + return 120; + case M416xlarge: + return 160; + case C518xlarge: + return 216; + case C5d18xlarge: + return 216; + case M524xlarge: + return 240; + case M5a24xlarge: + return 240; // We don't have a suggestion, but we don't want to fail completely // surely? - default: - return 1; + default: + return 1; } } @@ -797,4 +797,4 @@ public List> getAMITypeDescriptors() { } } -} \ No newline at end of file +} diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index d96887e83..af1cefb4c 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -900,8 +900,8 @@ private boolean checkInstance(Instance instance) { for (EC2AbstractSlave node : NodeIterator.nodes(EC2AbstractSlave.class)) { if ( (node.getInstanceId().equals(instance.getInstanceId())) && (! (instance.getState().getName().equalsIgnoreCase(InstanceStateName.Stopped.toString()) - )) - ){ + )) + ){ logInstanceCheck(instance, ". false - found existing corresponding Jenkins slave: " + node.getInstanceId()); return false; } @@ -1026,9 +1026,9 @@ HashMap> makeRunInstancesRequestAndFilters(Ima } } else { List groupIds = getSecurityGroupsBy("group-name", securityGroupSet, ec2) - .getSecurityGroups() - .stream().map(SecurityGroup::getGroupId) - .collect(Collectors.toList()); + .getSecurityGroups() + .stream().map(SecurityGroup::getGroupId) + .collect(Collectors.toList()); if (getAssociatePublicIp()) { net.setGroups(groupIds); } else { @@ -1282,14 +1282,14 @@ private void setupEphemeralDeviceMapping(Image image, List d @NonNull private static List makeImageAttributeList(@CheckForNull String attr) { return Stream.of(Util.tokenize(Util.fixNull(attr))) - .collect(Collectors.toList()); + .collect(Collectors.toList()); } @NonNull private DescribeImagesRequest makeDescribeImagesRequest() { List imageIds = Util.fixEmptyAndTrim(ami) == null ? - Collections.emptyList() : - Collections.singletonList(ami); + Collections.emptyList() : + Collections.singletonList(ami); List owners = makeImageAttributeList(amiOwners); List users = makeImageAttributeList(amiUsers); List filters = EC2Filter.toFilterList(amiFilters); @@ -1298,16 +1298,16 @@ private DescribeImagesRequest makeDescribeImagesRequest() { // legal but probably not what anyone wants. Might be better // as an exception. int numAttrs = Stream.of(imageIds, owners, users, filters) - .collect(Collectors.summingInt(List::size)); + .collect(Collectors.summingInt(List::size)); if (numAttrs == 0) { LOGGER.warning("Neither AMI ID nor AMI search attributes provided"); } return new DescribeImagesRequest() - .withImageIds(imageIds) - .withOwners(owners) - .withExecutableUsers(users) - .withFilters(filters); + .withImageIds(imageIds) + .withOwners(owners) + .withExecutableUsers(users) + .withFilters(filters); } @NonNull @@ -1318,8 +1318,7 @@ private Image getImage() throws AmazonClientException { List images = getParent().connect().describeImages(request).getImages(); if (images.isEmpty()) { throw new AmazonClientException("Unable to find image for request " + request); - } - + } // Sort in reverse by creation date to get latest image images.sort(Comparator.comparing(Image::getCreationDate).reversed()); @@ -1389,9 +1388,9 @@ private List provisionSpot(Image image, int number, EnumSet groupIds = getSecurityGroupsBy("group-name", securityGroupSet, ec2) - .getSecurityGroups() - .stream().map(SecurityGroup::getGroupId) - .collect(Collectors.toList()); + .getSecurityGroups() + .stream().map(SecurityGroup::getGroupId) + .collect(Collectors.toList()); net.setGroups(groupIds); } } @@ -1469,7 +1468,7 @@ private List provisionSpot(Image image, int number, EnumSet buildTags(String slaveType) { protected EC2OndemandSlave newOndemandSlave(Instance inst) throws FormException, IOException { EC2AgentConfig.OnDemand config = new EC2AgentConfig.OnDemandBuilder() - .withName(getSlaveName(inst.getInstanceId())) - .withInstanceId(inst.getInstanceId()) - .withDescription(description) - .withRemoteFS(remoteFS) - .withNumExecutors(getNumExecutors()) - .withLabelString(labels) - .withMode(mode) - .withInitScript(initScript) - .withTmpDir(tmpDir) - .withNodeProperties(nodeProperties.toList()) - .withRemoteAdmin(remoteAdmin) - .withJvmopts(jvmopts) - .withStopOnTerminate(stopOnTerminate) - .withIdleTerminationMinutes(idleTerminationMinutes) - .withPublicDNS(inst.getPublicDnsName()) - .withPrivateDNS(inst.getPrivateDnsName()) - .withTags(EC2Tag.fromAmazonTags(inst.getTags())) - .withCloudName(parent.name) - .withLaunchTimeout(getLaunchTimeout()) - .withAmiType(amiType) - .withConnectionStrategy(connectionStrategy) - .withMaxTotalUses(maxTotalUses) - .withTenancyAttribute(tenancy) - .build(); + .withName(getSlaveName(inst.getInstanceId())) + .withInstanceId(inst.getInstanceId()) + .withDescription(description) + .withRemoteFS(remoteFS) + .withNumExecutors(getNumExecutors()) + .withLabelString(labels) + .withMode(mode) + .withInitScript(initScript) + .withTmpDir(tmpDir) + .withNodeProperties(nodeProperties.toList()) + .withRemoteAdmin(remoteAdmin) + .withJvmopts(jvmopts) + .withStopOnTerminate(stopOnTerminate) + .withIdleTerminationMinutes(idleTerminationMinutes) + .withPublicDNS(inst.getPublicDnsName()) + .withPrivateDNS(inst.getPrivateDnsName()) + .withTags(EC2Tag.fromAmazonTags(inst.getTags())) + .withCloudName(parent.name) + .withLaunchTimeout(getLaunchTimeout()) + .withAmiType(amiType) + .withConnectionStrategy(connectionStrategy) + .withMaxTotalUses(maxTotalUses) + .withTenancyAttribute(tenancy) + .build(); return EC2AgentFactory.getInstance().createOnDemandAgent(config); } protected EC2SpotSlave newSpotSlave(SpotInstanceRequest sir) throws FormException, IOException { EC2AgentConfig.Spot config = new EC2AgentConfig.SpotBuilder() - .withName(getSlaveName(sir.getSpotInstanceRequestId())) - .withSpotInstanceRequestId(sir.getSpotInstanceRequestId()) - .withDescription(description) - .withRemoteFS(remoteFS) - .withNumExecutors(getNumExecutors()) - .withMode(mode) - .withInitScript(initScript) - .withTmpDir(tmpDir) - .withLabelString(labels) - .withNodeProperties(nodeProperties.toList()) - .withRemoteAdmin(remoteAdmin) - .withJvmopts(jvmopts) - .withIdleTerminationMinutes(idleTerminationMinutes) - .withTags(EC2Tag.fromAmazonTags(sir.getTags())) - .withCloudName(parent.name) - .withLaunchTimeout(getLaunchTimeout()) - .withAmiType(amiType) - .withConnectionStrategy(connectionStrategy) - .withMaxTotalUses(maxTotalUses) - .build(); + .withName(getSlaveName(sir.getSpotInstanceRequestId())) + .withSpotInstanceRequestId(sir.getSpotInstanceRequestId()) + .withDescription(description) + .withRemoteFS(remoteFS) + .withNumExecutors(getNumExecutors()) + .withMode(mode) + .withInitScript(initScript) + .withTmpDir(tmpDir) + .withLabelString(labels) + .withNodeProperties(nodeProperties.toList()) + .withRemoteAdmin(remoteAdmin) + .withJvmopts(jvmopts) + .withIdleTerminationMinutes(idleTerminationMinutes) + .withTags(EC2Tag.fromAmazonTags(sir.getTags())) + .withCloudName(parent.name) + .withLaunchTimeout(getLaunchTimeout()) + .withAmiType(amiType) + .withConnectionStrategy(connectionStrategy) + .withMaxTotalUses(maxTotalUses) + .build(); return EC2AgentFactory.getInstance().createSpotAgent(config); } @@ -1667,7 +1666,7 @@ public EC2AbstractSlave attach(String instanceId, TaskListener listener) throws return newOndemandSlave(inst); } catch (FormException e) { throw new AssertionError(); // we should have discovered all - // configuration issues upfront + // configuration issues upfront } } @@ -1696,7 +1695,7 @@ protected Object readResolve() { amiType = new UnixData(rootCommandPrefix, slaveCommandPrefix, slaveCommandSuffix, sshPort); } - // 1.43 new parameters + // 1.43 new parameters if (connectionStrategy == null ) { connectionStrategy = ConnectionStrategy.backwardsCompatible(usePrivateDnsName, connectUsingPublicIp, associatePublicIp); } @@ -1856,9 +1855,9 @@ public FormValidation doCheckJvmopts(@QueryParameter String value){ */ @RequirePOST public FormValidation doValidateAmi(@QueryParameter boolean useInstanceProfileForCredentials, - @QueryParameter String credentialsId, @QueryParameter String ec2endpoint, - @QueryParameter String region, final @QueryParameter String ami, @QueryParameter String roleArn, - @QueryParameter String roleSessionName) throws IOException { + @QueryParameter String credentialsId, @QueryParameter String ec2endpoint, + @QueryParameter String region, final @QueryParameter String ami, @QueryParameter String roleArn, + @QueryParameter String roleSessionName) throws IOException { checkPermission(EC2Cloud.PROVISION); AWSCredentialsProvider credentialsProvider = EC2Cloud.createCredentialsProvider(useInstanceProfileForCredentials, credentialsId, roleArn, roleSessionName, region); AmazonEC2 ec2; @@ -1933,8 +1932,8 @@ public FormValidation doCheckMinimumNumberOfInstances(@QueryParameter String val } if (val > instanceCap) { return FormValidation - .error("Minimum number of instances must not be larger than AMI Instance Cap %d", - instanceCap); + .error("Minimum number of instances must not be larger than AMI Instance Cap %d", + instanceCap); } return FormValidation.ok(); } @@ -1988,8 +1987,8 @@ public FormValidation doCheckMinimumNumberOfSpareInstances(@QueryParameter Strin } if (val > instanceCap) { return FormValidation - .error("Minimum number of spare instances must not be larger than AMI Instance Cap %d", - instanceCap); + .error("Minimum number of spare instances must not be larger than AMI Instance Cap %d", + instanceCap); } return FormValidation.ok(); } @@ -2039,8 +2038,8 @@ public FormValidation doCheckLaunchTimeoutStr(@QueryParameter String value) { @RequirePOST public ListBoxModel doFillZoneItems(@QueryParameter boolean useInstanceProfileForCredentials, - @QueryParameter String credentialsId, @QueryParameter String region, @QueryParameter String roleArn, - @QueryParameter String roleSessionName) + @QueryParameter String credentialsId, @QueryParameter String region, @QueryParameter String roleArn, + @QueryParameter String roleSessionName) throws IOException, ServletException { checkPermission(EC2Cloud.PROVISION); AWSCredentialsProvider credentialsProvider = EC2Cloud.createCredentialsProvider(useInstanceProfileForCredentials, credentialsId, roleArn, roleSessionName, region); @@ -2127,4 +2126,4 @@ public ListBoxModel doFillTenancyItems(@QueryParameter String tenancy) { .collect(Collectors.toCollection(ListBoxModel::new)); } } -} \ No newline at end of file +} diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java index 49e6a3b9e..2ad772aaa 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java @@ -24,13 +24,32 @@ package hudson.plugins.ec2; import com.amazonaws.services.ec2.AmazonEC2; -import com.amazonaws.services.ec2.model.*; - +import com.amazonaws.services.ec2.model.DescribeImagesRequest; +import com.amazonaws.services.ec2.model.DescribeImagesResult; +import com.amazonaws.services.ec2.model.DescribeInstancesRequest; +import com.amazonaws.services.ec2.model.DescribeInstancesResult; +import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest; +import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult; +import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; +import com.amazonaws.services.ec2.model.DescribeSubnetsResult; +import com.amazonaws.services.ec2.model.IamInstanceProfile; +import com.amazonaws.services.ec2.model.Image; +import com.amazonaws.services.ec2.model.Instance; +import com.amazonaws.services.ec2.model.InstanceNetworkInterfaceSpecification; import com.amazonaws.services.ec2.model.InstanceState; +import com.amazonaws.services.ec2.model.InstanceType; +import com.amazonaws.services.ec2.model.KeyPair; +import com.amazonaws.services.ec2.model.RunInstancesRequest; +import com.amazonaws.services.ec2.model.RunInstancesResult; +import com.amazonaws.services.ec2.model.SecurityGroup; +import com.amazonaws.services.ec2.model.Subnet; + import hudson.Util; import hudson.model.Node; import hudson.plugins.ec2.SlaveTemplate.ProvisionOptions; import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig; +import com.amazonaws.services.ec2.model.Reservation; +import com.amazonaws.services.ec2.model.Tenancy; import hudson.plugins.ec2.util.PrivateKeyHelper; import jenkins.model.Jenkins; diff --git a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java index 934527c32..26dfcfcad 100644 --- a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java +++ b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java @@ -15,7 +15,6 @@ @Extension public class EC2AgentFactoryMockImpl implements EC2AgentFactory { - @Override public EC2OndemandSlave createOnDemandAgent(EC2AgentConfig.OnDemand config) throws Descriptor.FormException, IOException { From 29a280d069286dfa642ff25919d4a178660d70ce Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Sat, 20 Mar 2021 01:08:15 +0530 Subject: [PATCH 21/26] migrating old tenancy value to new variable --- src/main/java/hudson/plugins/ec2/SlaveTemplate.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index af1cefb4c..e6886924b 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -307,7 +307,7 @@ public class SlaveTemplate implements Describable { public String currentSubnetId; - public final Tenancy tenancy; + public Tenancy tenancy; private transient/* almost final */ Set labelSet; @@ -1708,6 +1708,10 @@ protected Object readResolve() { nodeProperties = new DescribableList<>(Saveable.NOOP); } + // migration of old value to new variable. + if(useDedicatedTenancy){ + tenancy = Tenancy.Dedicated; + } return this; } From 37d4fbd273a44a353ca22d92479eab72a7368a8f Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Tue, 23 Mar 2021 01:42:42 +0530 Subject: [PATCH 22/26] Adding mac support in ec2-plugin --- .../java/hudson/plugins/ec2/AMITypeData.java | 2 + .../hudson/plugins/ec2/EC2AbstractSlave.java | 8 +- .../plugins/ec2/EC2HostAddressProvider.java | 17 +- .../hudson/plugins/ec2/EC2OndemandSlave.java | 5 +- src/main/java/hudson/plugins/ec2/MacData.java | 142 ++++++ .../hudson/plugins/ec2/SlaveTemplate.java | 14 +- .../java/hudson/plugins/ec2/UnixData.java | 5 + .../java/hudson/plugins/ec2/WindowsData.java | 5 + .../plugins/ec2/ssh/EC2MacLauncher.java | 462 ++++++++++++++++++ ...tKeyVerificationAdministrativeMonitor.java | 2 +- .../hudson/plugins/ec2/MacData/config.jelly | 39 ++ .../plugins/ec2/ConfigurationAsCodeTest.java | 62 +++ .../hudson/plugins/ec2/SlaveTemplateTest.java | 24 + src/test/resources/hudson/plugins/ec2/Mac.yml | 14 + .../resources/hudson/plugins/ec2/MacData.yml | 21 + .../hudson/plugins/ec2/MacDataExport.yml | 32 ++ 16 files changed, 843 insertions(+), 11 deletions(-) create mode 100644 src/main/java/hudson/plugins/ec2/MacData.java create mode 100644 src/main/java/hudson/plugins/ec2/ssh/EC2MacLauncher.java create mode 100644 src/main/resources/hudson/plugins/ec2/MacData/config.jelly create mode 100644 src/test/resources/hudson/plugins/ec2/Mac.yml create mode 100644 src/test/resources/hudson/plugins/ec2/MacData.yml create mode 100644 src/test/resources/hudson/plugins/ec2/MacDataExport.yml diff --git a/src/main/java/hudson/plugins/ec2/AMITypeData.java b/src/main/java/hudson/plugins/ec2/AMITypeData.java index 6cb3b623f..0ea3a045a 100644 --- a/src/main/java/hudson/plugins/ec2/AMITypeData.java +++ b/src/main/java/hudson/plugins/ec2/AMITypeData.java @@ -6,4 +6,6 @@ public abstract class AMITypeData extends AbstractDescribableImpl { public abstract boolean isWindows(); public abstract boolean isUnix(); + + public abstract boolean isMac(); } diff --git a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java index a99740db6..1c7f9781d 100644 --- a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java @@ -517,21 +517,21 @@ public String getRemoteAdmin() { } String getRootCommandPrefix() { - String commandPrefix = amiType.isUnix() ? ((UnixData) amiType).getRootCommandPrefix() : ""; + String commandPrefix = (amiType.isUnix() ? ((UnixData) amiType).getRootCommandPrefix() : (amiType.isMac() ? ((MacData) amiType).getRootCommandPrefix() : "")); if (commandPrefix == null || commandPrefix.length() == 0) return ""; return commandPrefix + " "; } String getSlaveCommandPrefix() { - String commandPrefix = amiType.isUnix() ? ((UnixData) amiType).getSlaveCommandPrefix() : ""; + String commandPrefix = (amiType.isUnix() ? ((UnixData) amiType).getSlaveCommandPrefix() :(amiType.isMac() ? ((MacData) amiType).getSlaveCommandPrefix() : "")); if (commandPrefix == null || commandPrefix.length() == 0) return ""; return commandPrefix + " "; } String getSlaveCommandSuffix() { - String commandSuffix = amiType.isUnix() ? ((UnixData) amiType).getSlaveCommandSuffix() : ""; + String commandSuffix = (amiType.isUnix() ? ((UnixData) amiType).getSlaveCommandSuffix() :(amiType.isMac() ? ((MacData) amiType).getSlaveCommandSuffix() : "")); if (commandSuffix == null || commandSuffix.length() == 0) return ""; return " " + commandSuffix; @@ -542,7 +542,7 @@ String getJvmopts() { } public int getSshPort() { - String sshPort = amiType.isUnix() ? ((UnixData) amiType).getSshPort() : "22"; + String sshPort = (amiType.isUnix() ? ((UnixData) amiType).getSshPort() :(amiType.isMac() ? ((MacData) amiType).getSshPort() : "22")); if (sshPort == null || sshPort.length() == 0) return 22; diff --git a/src/main/java/hudson/plugins/ec2/EC2HostAddressProvider.java b/src/main/java/hudson/plugins/ec2/EC2HostAddressProvider.java index b8286212d..0be9d394c 100644 --- a/src/main/java/hudson/plugins/ec2/EC2HostAddressProvider.java +++ b/src/main/java/hudson/plugins/ec2/EC2HostAddressProvider.java @@ -23,13 +23,28 @@ public static String unix(Instance instance, ConnectionStrategy strategy) { } } + public static String mac(Instance instance, ConnectionStrategy strategy) { + switch (strategy) { + case PUBLIC_DNS: + return filterNonEmpty(getPublicDnsName(instance)).orElse(getPublicIpAddress(instance)); + case PUBLIC_IP: + return getPublicIpAddress(instance); + case PRIVATE_DNS: + return filterNonEmpty(getPrivateDnsName(instance)).orElse(getPrivateIpAddress(instance)); + case PRIVATE_IP: + return getPrivateIpAddress(instance); + default: + throw new IllegalArgumentException("Could not mac host address for strategy = " + strategy.toString()); + } + } + public static String windows(Instance instance, ConnectionStrategy strategy) { if (strategy.equals(PRIVATE_DNS) || strategy.equals(PRIVATE_IP)) { return getPrivateIpAddress(instance); } else if (strategy.equals(PUBLIC_DNS) || strategy.equals(PUBLIC_IP)) { return getPublicIpAddress(instance); } else { - throw new IllegalArgumentException("Could not unix host address for strategy = " + strategy.toString()); + throw new IllegalArgumentException("Could not windows host address for strategy = " + strategy.toString()); } } diff --git a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java index e328db3b7..eddd2ab38 100644 --- a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java @@ -6,6 +6,7 @@ import hudson.model.Node; import hudson.plugins.ec2.ssh.EC2UnixLauncher; import hudson.plugins.ec2.win.EC2WindowsLauncher; +import hudson.plugins.ec2.ssh.EC2MacLauncher; import hudson.slaves.NodeProperty; import java.io.IOException; @@ -62,8 +63,8 @@ public EC2OndemandSlave(String name, String instanceId, String templateDescripti public EC2OndemandSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) throws FormException, IOException { - super(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, amiType.isWindows() ? new EC2WindowsLauncher() - : new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, tenancy); + super(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, (amiType.isWindows() ? new EC2WindowsLauncher() : (amiType.isMac() ? new EC2MacLauncher(): + new EC2UnixLauncher())), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, tenancy); this.publicDNS = publicDNS; this.privateDNS = privateDNS; diff --git a/src/main/java/hudson/plugins/ec2/MacData.java b/src/main/java/hudson/plugins/ec2/MacData.java new file mode 100644 index 000000000..fba4c8312 --- /dev/null +++ b/src/main/java/hudson/plugins/ec2/MacData.java @@ -0,0 +1,142 @@ +package hudson.plugins.ec2; + +import hudson.Extension; +import hudson.model.Descriptor; +import hudson.util.FormValidation; +import jenkins.model.Jenkins; +import org.apache.commons.lang.StringUtils; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.QueryParameter; + +public class MacData extends AMITypeData { + private final String rootCommandPrefix; + private final String slaveCommandPrefix; + private final String slaveCommandSuffix; + private final String sshPort; + + @DataBoundConstructor + public MacData(String rootCommandPrefix, String slaveCommandPrefix, String slaveCommandSuffix, String sshPort) { + this.rootCommandPrefix = rootCommandPrefix; + this.slaveCommandPrefix = slaveCommandPrefix; + this.slaveCommandSuffix = slaveCommandSuffix; + this.sshPort = sshPort; + + this.readResolve(); + } + + protected Object readResolve() { + Jenkins.get().checkPermission(Jenkins.ADMINISTER); + return this; + } + + @Override + public boolean isWindows() { + return false; + } + + @Override + public boolean isUnix() { + return false; + } + + @Override + public boolean isMac() { + return true; + } + + @Extension + public static class DescriptorImpl extends Descriptor { + @Override + public String getDisplayName() { + return "mac"; + } + + @Restricted(NoExternalUse.class) + public FormValidation doCheckRootCommandPrefix(@QueryParameter String value){ + if(StringUtils.isBlank(value) || Jenkins.get().hasPermission(Jenkins.ADMINISTER)){ + return FormValidation.ok(); + }else{ + return FormValidation.error(Messages.General_MissingPermission()); + } + } + + @Restricted(NoExternalUse.class) + public FormValidation doCheckSlaveCommandPrefix(@QueryParameter String value){ + if(StringUtils.isBlank(value) || Jenkins.get().hasPermission(Jenkins.ADMINISTER)){ + return FormValidation.ok(); + }else{ + return FormValidation.error(Messages.General_MissingPermission()); + } + } + + @Restricted(NoExternalUse.class) + public FormValidation doCheckSlaveCommandSuffix(@QueryParameter String value){ + if(StringUtils.isBlank(value) || Jenkins.get().hasPermission(Jenkins.ADMINISTER)){ + return FormValidation.ok(); + }else{ + return FormValidation.error(Messages.General_MissingPermission()); + } + } + } + + public String getRootCommandPrefix() { + return rootCommandPrefix; + } + + public String getSlaveCommandPrefix() { + return slaveCommandPrefix; + } + + public String getSlaveCommandSuffix() { + return slaveCommandSuffix; + } + + public String getSshPort() { + return sshPort == null || sshPort.isEmpty() ? "22" : sshPort; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((rootCommandPrefix == null) ? 0 : rootCommandPrefix.hashCode()); + result = prime * result + ((slaveCommandPrefix == null) ? 0 : slaveCommandPrefix.hashCode()); + result = prime * result + ((slaveCommandSuffix == null) ? 0 : slaveCommandSuffix.hashCode()); + result = prime * result + ((sshPort == null) ? 0 : sshPort.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (this.getClass() != obj.getClass()) + return false; + final MacData other = (MacData) obj; + if (StringUtils.isEmpty(rootCommandPrefix)) { + if (!StringUtils.isEmpty(other.rootCommandPrefix)) + return false; + } else if (!rootCommandPrefix.equals(other.rootCommandPrefix)) + return false; + if (StringUtils.isEmpty(slaveCommandPrefix)) { + if (!StringUtils.isEmpty(other.slaveCommandPrefix)) + return false; + } else if (!slaveCommandPrefix.equals(other.slaveCommandPrefix)) + return false; + if (StringUtils.isEmpty(slaveCommandSuffix)) { + if (!StringUtils.isEmpty(other.slaveCommandSuffix)) + return false; + } else if (!slaveCommandSuffix.equals(other.slaveCommandSuffix)) + return false; + if (StringUtils.isEmpty(sshPort)) { + if (!StringUtils.isEmpty(other.sshPort)) + return false; + } else if (!sshPort.equals(other.sshPort)) + return false; + return true; + } +} diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index e6886924b..90be4a5be 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -650,6 +650,9 @@ public int getSshPort() { if (amiType.isUnix()) { sshPort = ((UnixData) amiType).getSshPort(); } + if (amiType.isMac()) { + sshPort = ((MacData) amiType).getSshPort(); + } return Integer.parseInt(sshPort); } catch (NumberFormatException e) { return 22; @@ -661,15 +664,15 @@ public String getRemoteAdmin() { } public String getRootCommandPrefix() { - return amiType.isUnix() ? ((UnixData) amiType).getRootCommandPrefix() : ""; + return (amiType.isUnix() ? ((UnixData) amiType).getRootCommandPrefix() : (amiType.isMac() ? ((MacData) amiType).getRootCommandPrefix():"")); } public String getSlaveCommandPrefix() { - return amiType.isUnix() ? ((UnixData) amiType).getSlaveCommandPrefix() : ""; + return (amiType.isUnix() ? ((UnixData) amiType).getSlaveCommandPrefix() : (amiType.isMac() ? ((MacData) amiType).getSlaveCommandPrefix() : "")); } public String getSlaveCommandSuffix() { - return amiType.isUnix() ? ((UnixData) amiType).getSlaveCommandSuffix() : ""; + return (amiType.isUnix() ? ((UnixData) amiType).getSlaveCommandSuffix() : (amiType.isMac() ? ((MacData) amiType).getSlaveCommandSuffix() : "")); } public String chooseSubnetId() { @@ -1712,6 +1715,7 @@ protected Object readResolve() { if(useDedicatedTenancy){ tenancy = Tenancy.Dedicated; } + return this; } @@ -1739,6 +1743,10 @@ public boolean isUnixSlave() { return amiType.isUnix(); } + public boolean isMacSlave() { + return amiType.isMac(); + } + public Secret getAdminPassword() { return amiType.isWindows() ? ((WindowsData) amiType).getPassword() : Secret.fromString(""); } diff --git a/src/main/java/hudson/plugins/ec2/UnixData.java b/src/main/java/hudson/plugins/ec2/UnixData.java index b46b0bc1d..2f61cce5d 100644 --- a/src/main/java/hudson/plugins/ec2/UnixData.java +++ b/src/main/java/hudson/plugins/ec2/UnixData.java @@ -42,6 +42,11 @@ public boolean isUnix() { return true; } + @Override + public boolean isMac() { + return false; + } + @Extension public static class DescriptorImpl extends Descriptor { @Override diff --git a/src/main/java/hudson/plugins/ec2/WindowsData.java b/src/main/java/hudson/plugins/ec2/WindowsData.java index 22cb2aa57..4eba6b25f 100644 --- a/src/main/java/hudson/plugins/ec2/WindowsData.java +++ b/src/main/java/hudson/plugins/ec2/WindowsData.java @@ -50,6 +50,11 @@ public boolean isUnix() { return false; } + @Override + public boolean isMac() { + return false; + } + public Secret getPassword() { return password; } diff --git a/src/main/java/hudson/plugins/ec2/ssh/EC2MacLauncher.java b/src/main/java/hudson/plugins/ec2/ssh/EC2MacLauncher.java new file mode 100644 index 000000000..4d5a90e44 --- /dev/null +++ b/src/main/java/hudson/plugins/ec2/ssh/EC2MacLauncher.java @@ -0,0 +1,462 @@ +/* + * The MIT License + * + * Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.plugins.ec2.ssh; + +import com.amazonaws.AmazonClientException; +import com.amazonaws.services.ec2.model.Instance; +import com.amazonaws.services.ec2.model.KeyPair; +import com.trilead.ssh2.*; +import hudson.FilePath; +import hudson.ProxyConfiguration; +import hudson.Util; +import hudson.model.Descriptor; +import hudson.model.TaskListener; +import hudson.plugins.ec2.*; +import hudson.plugins.ec2.ssh.verifiers.HostKey; +import hudson.plugins.ec2.ssh.verifiers.Messages; +import hudson.remoting.Channel; +import hudson.remoting.Channel.Listener; +import hudson.slaves.CommandLauncher; +import hudson.slaves.ComputerLauncher; +import jenkins.model.Jenkins; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; + +import java.io.*; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.nio.charset.StandardCharsets; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * {@link ComputerLauncher} that connects to a Unix slave on EC2 by using SSH. + * + * @author Kohsuke Kawaguchi + */ +public class EC2MacLauncher extends EC2ComputerLauncher { + + private static final Logger LOGGER = Logger.getLogger(EC2MacLauncher.class.getName()); + + private static final String BOOTSTRAP_AUTH_SLEEP_MS = "jenkins.ec2.bootstrapAuthSleepMs"; + private static final String BOOTSTRAP_AUTH_TRIES= "jenkins.ec2.bootstrapAuthTries"; + private static final String READINESS_SLEEP_MS = "jenkins.ec2.readinessSleepMs"; + private static final String READINESS_TRIES= "jenkins.ec2.readinessTries"; + + private static int bootstrapAuthSleepMs = 30000; + private static int bootstrapAuthTries = 30; + + private static int readinessSleepMs = 1000; + private static int readinessTries = 120; + + static { + String prop = System.getProperty(BOOTSTRAP_AUTH_SLEEP_MS); + if (prop != null) + bootstrapAuthSleepMs = Integer.parseInt(prop); + prop = System.getProperty(BOOTSTRAP_AUTH_TRIES); + if (prop != null) + bootstrapAuthTries = Integer.parseInt(prop); + prop = System.getProperty(READINESS_TRIES); + if (prop != null) + readinessTries = Integer.parseInt(prop); + prop = System.getProperty(READINESS_SLEEP_MS); + if (prop != null) + readinessSleepMs = Integer.parseInt(prop); + } + + protected void log(Level level, EC2Computer computer, TaskListener listener, String message) { + EC2Cloud.log(LOGGER, level, listener, message); + } + + protected void logException(EC2Computer computer, TaskListener listener, String message, Throwable exception) { + EC2Cloud.log(LOGGER, Level.WARNING, listener, message, exception); + } + + protected void logInfo(EC2Computer computer, TaskListener listener, String message) { + log(Level.INFO, computer, listener, message); + } + + protected void logWarning(EC2Computer computer, TaskListener listener, String message) { + log(Level.WARNING, computer, listener, message); + } + + protected String buildUpCommand(EC2Computer computer, String command) { + String remoteAdmin = computer.getRemoteAdmin(); + if (remoteAdmin != null && !remoteAdmin.equals("root")) { + command = computer.getRootCommandPrefix() + " " + command; + } + return command; + } + + @Override + protected void launchScript(EC2Computer computer, TaskListener listener) throws IOException, + AmazonClientException, InterruptedException { + final Connection conn; + Connection cleanupConn = null; // java's code path analysis for final + // doesn't work that well. + boolean successful = false; + PrintStream logger = listener.getLogger(); + EC2AbstractSlave node = computer.getNode(); + SlaveTemplate template = computer.getSlaveTemplate(); + + if(node == null) { + throw new IllegalStateException(); + } + + if (template == null) { + throw new IOException("Could not find corresponding slave template for " + computer.getDisplayName()); + } + + if (node instanceof EC2Readiness) { + EC2Readiness readinessNode = (EC2Readiness) node; + int tries = readinessTries; + + while (tries-- > 0) { + if (readinessNode.isReady()) { + break; + } + + logInfo(computer, listener, "Node still not ready. Current status: " + readinessNode.getEc2ReadinessStatus()); + Thread.sleep(readinessSleepMs); + } + + if (!readinessNode.isReady()) { + throw new AmazonClientException("Node still not ready, timed out after " + (readinessTries * readinessSleepMs / 1000) + "s with status " + readinessNode.getEc2ReadinessStatus()); + } + } + + logInfo(computer, listener, "Launching instance: " + node.getInstanceId()); + + try { + boolean isBootstrapped = bootstrap(computer, listener, template); + if (isBootstrapped) { + // connect fresh as ROOT + logInfo(computer, listener, "connect fresh as root"); + cleanupConn = connectToSsh(computer, listener, template); + KeyPair key = computer.getCloud().getKeyPair(); + if (key == null || !cleanupConn.authenticateWithPublicKey(computer.getRemoteAdmin(), key.getKeyMaterial().toCharArray(), "")) { + logWarning(computer, listener, "Authentication failed"); + return; // failed to connect as root. + } + } else { + logWarning(computer, listener, "bootstrapresult failed"); + return; // bootstrap closed for us. + } + conn = cleanupConn; + + SCPClient scp = conn.createSCPClient(); + String initScript = node.initScript; + String tmpDir = (Util.fixEmptyAndTrim(node.tmpDir) != null ? node.tmpDir : "/tmp"); + + logInfo(computer, listener, "Creating tmp directory (" + tmpDir + ") if it does not exist"); + conn.exec("mkdir -p " + tmpDir, logger); + + if (initScript != null && initScript.trim().length() > 0 + && conn.exec("test -e ~/.hudson-run-init", logger) != 0) { + logInfo(computer, listener, "Executing init script"); + scp.put(initScript.getBytes("UTF-8"), "init.sh", tmpDir, "0700"); + Session sess = conn.openSession(); + sess.requestDumbPTY(); // so that the remote side bundles stdout + // and stderr + sess.execCommand(buildUpCommand(computer, tmpDir + "/init.sh")); + + sess.getStdin().close(); // nothing to write here + sess.getStderr().close(); // we are not supposed to get anything + // from stderr + IOUtils.copy(sess.getStdout(), logger); + + int exitStatus = waitCompletion(sess); + if (exitStatus != 0) { + logWarning(computer, listener, "init script failed: exit code=" + exitStatus); + return; + } + sess.close(); + + logInfo(computer, listener, "Creating ~/.hudson-run-init"); + + // Needs a tty to run sudo. + sess = conn.openSession(); + sess.requestDumbPTY(); // so that the remote side bundles stdout + // and stderr + sess.execCommand(buildUpCommand(computer, "touch ~/.hudson-run-init")); + + sess.getStdin().close(); // nothing to write here + sess.getStderr().close(); // we are not supposed to get anything + // from stderr + IOUtils.copy(sess.getStdout(), logger); + + exitStatus = waitCompletion(sess); + if (exitStatus != 0) { + logWarning(computer, listener, "init script failed: exit code=" + exitStatus); + return; + } + sess.close(); + } + + // TODO: parse the version number. maven-enforcer-plugin might help + executeRemote(computer, conn, "java -fullversion", "curl -L -O https://corretto.aws/downloads/latest/amazon-corretto-8-x64-macos-jdk.pkg; sudo installer -pkg amazon-corretto-8-x64-macos-jdk.pkg -target /", logger, listener); + + // Always copy so we get the most recent slave.jar + logInfo(computer, listener, "Copying remoting.jar to: " + tmpDir); + scp.put(Jenkins.get().getJnlpJars("remoting.jar").readFully(), "remoting.jar", tmpDir); + + final String jvmopts = node.jvmopts; + final String prefix = computer.getSlaveCommandPrefix(); + final String suffix = computer.getSlaveCommandSuffix(); + final String remoteFS = node.getRemoteFS(); + final String workDir = Util.fixEmptyAndTrim(remoteFS) != null ? remoteFS : tmpDir; + String launchString = prefix + " java " + (jvmopts != null ? jvmopts : "") + " -jar " + tmpDir + "/remoting.jar -workDir " + workDir + suffix; + // launchString = launchString.trim(); + + SlaveTemplate slaveTemplate = computer.getSlaveTemplate(); + + if (slaveTemplate != null && slaveTemplate.isConnectBySSHProcess()) { + File identityKeyFile = createIdentityKeyFile(computer); + + try { + // Obviously the master must have an installed ssh client. + // Depending on the strategy selected on the UI, we set the StrictHostKeyChecking flag + String sshClientLaunchString = String.format("ssh -o StrictHostKeyChecking=%s -i %s %s@%s -p %d %s", slaveTemplate.getHostKeyVerificationStrategy().getSshCommandEquivalentFlag(), identityKeyFile.getAbsolutePath(), node.remoteAdmin, getEC2HostAddress(computer, template), node.getSshPort(), launchString); + + logInfo(computer, listener, "Launching remoting agent (via SSH client process): " + sshClientLaunchString); + CommandLauncher commandLauncher = new CommandLauncher(sshClientLaunchString, null); + commandLauncher.launch(computer, listener); + } finally { + if(!identityKeyFile.delete()) { + LOGGER.log(Level.WARNING, "Failed to delete identity key file"); + } + } + } else { + logInfo(computer, listener, "Launching remoting agent (via Trilead SSH2 Connection): " + launchString); + final Session sess = conn.openSession(); + sess.execCommand(launchString); + computer.setChannel(sess.getStdout(), sess.getStdin(), logger, new Listener() { + @Override + public void onClosed(Channel channel, IOException cause) { + sess.close(); + conn.close(); + } + }); + } + + successful = true; + } finally { + if (cleanupConn != null && !successful) + cleanupConn.close(); + } + } + + private boolean executeRemote(EC2Computer computer, Connection conn, String checkCommand, String command, PrintStream logger, TaskListener listener) + throws IOException, InterruptedException { + logInfo(computer, listener,"Verifying: " + checkCommand); + if (conn.exec(checkCommand, logger) != 0) { + logInfo(computer, listener, "Installing: " + command); + if (conn.exec(command, logger) != 0) { + logWarning(computer, listener, "Failed to install: " + command); + return false; + } + } + return true; + } + + private File createIdentityKeyFile(EC2Computer computer) throws IOException { + EC2PrivateKey ec2PrivateKey = computer.getCloud().resolvePrivateKey(); + String privateKey = ""; + if (ec2PrivateKey != null){ + privateKey = ec2PrivateKey.getPrivateKey(); + } + + File tempFile = File.createTempFile("ec2_", ".pem"); + + try { + FileOutputStream fileOutputStream = new FileOutputStream(tempFile); + OutputStreamWriter writer = new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8); + try { + writer.write(privateKey); + writer.flush(); + } finally { + writer.close(); + fileOutputStream.close(); + } + FilePath filePath = new FilePath(tempFile); + filePath.chmod(0400); // octal file mask - readonly by owner + return tempFile; + } catch (Exception e) { + if (!tempFile.delete()) { + LOGGER.log(Level.WARNING, "Failed to delete identity key file"); + } + throw new IOException("Error creating temporary identity key file for connecting to EC2 agent.", e); + } + } + + private boolean bootstrap(EC2Computer computer, TaskListener listener, SlaveTemplate template) throws IOException, + InterruptedException, AmazonClientException { + logInfo(computer, listener, "bootstrap()"); + Connection bootstrapConn = null; + try { + int tries = bootstrapAuthTries; + boolean isAuthenticated = false; + logInfo(computer, listener, "Getting keypair..."); + KeyPair key = computer.getCloud().getKeyPair(); + if (key == null){ + logWarning(computer, listener, "Could not retrieve a valid key pair."); + return false; + } + logInfo(computer, listener, + String.format("Using private key %s (SHA-1 fingerprint %s)", key.getKeyName(), key.getKeyFingerprint())); + while (tries-- > 0) { + logInfo(computer, listener, "Authenticating as " + computer.getRemoteAdmin()); + try { + bootstrapConn = connectToSsh(computer, listener, template); + isAuthenticated = bootstrapConn.authenticateWithPublicKey(computer.getRemoteAdmin(), key.getKeyMaterial().toCharArray(), ""); + } catch(IOException e) { + logException(computer, listener, "Exception trying to authenticate", e); + bootstrapConn.close(); + } + if (isAuthenticated) { + break; + } + logWarning(computer, listener, "Authentication failed. Trying again..."); + Thread.sleep(bootstrapAuthSleepMs); + } + if (!isAuthenticated) { + logWarning(computer, listener, "Authentication failed"); + return false; + } + } finally { + if (bootstrapConn != null) { + bootstrapConn.close(); + } + } + return true; + } + + private Connection connectToSsh(EC2Computer computer, TaskListener listener, SlaveTemplate template) throws AmazonClientException, + InterruptedException { + final EC2AbstractSlave node = computer.getNode(); + final long timeout = node == null ? 0L : node.getLaunchTimeoutInMillis(); + final long startTime = System.currentTimeMillis(); + while (true) { + try { + long waitTime = System.currentTimeMillis() - startTime; + if (timeout > 0 && waitTime > timeout) { + throw new AmazonClientException("Timed out after " + (waitTime / 1000) + + " seconds of waiting for ssh to become available. (maximum timeout configured is " + + (timeout / 1000) + ")"); + } + String host = getEC2HostAddress(computer, template); + + if ((node instanceof EC2SpotSlave) && computer.getInstanceId() == null) { + // getInstanceId() on EC2SpotSlave can return null if the spot request doesn't yet know + // the instance id that it is starting. Continue to wait until the instanceId is set. + logInfo(computer, listener, "empty instanceId for Spot Slave."); + throw new IOException("goto sleep"); + } + + if ("0.0.0.0".equals(host)) { + logWarning(computer, listener, "Invalid host 0.0.0.0, your host is most likely waiting for an ip address."); + throw new IOException("goto sleep"); + } + + int port = computer.getSshPort(); + Integer slaveConnectTimeout = Integer.getInteger("jenkins.ec2.slaveConnectTimeout", 10000); + logInfo(computer, listener, "Connecting to " + host + " on port " + port + ", with timeout " + slaveConnectTimeout + + "."); + Connection conn = new Connection(host, port); + ProxyConfiguration proxyConfig = Jenkins.get().proxy; + Proxy proxy = proxyConfig == null ? Proxy.NO_PROXY : proxyConfig.createProxy(host); + if (!proxy.equals(Proxy.NO_PROXY) && proxy.address() instanceof InetSocketAddress) { + InetSocketAddress address = (InetSocketAddress) proxy.address(); + HTTPProxyData proxyData = null; + if (null != proxyConfig.getUserName()) { + proxyData = new HTTPProxyData(address.getHostName(), address.getPort(), proxyConfig.getUserName(), proxyConfig.getPassword()); + } else { + proxyData = new HTTPProxyData(address.getHostName(), address.getPort()); + } + conn.setProxyData(proxyData); + logInfo(computer, listener, "Using HTTP Proxy Configuration"); + } + + conn.connect(new ServerHostKeyVerifierImpl(computer, listener), slaveConnectTimeout, slaveConnectTimeout); + logInfo(computer, listener, "Connected via SSH."); + return conn; // successfully connected + } 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 (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 { + logInfo(computer, listener, "Waiting for SSH to come up. Sleeping 5."); + Thread.sleep(5000); + } + } + } + } + + /** + * Our host key verifier just pick up the right strategy and call its verify method. + */ + private static class ServerHostKeyVerifierImpl implements ServerHostKeyVerifier { + + private final EC2Computer computer; + private final TaskListener listener; + + public ServerHostKeyVerifierImpl(final EC2Computer computer, final TaskListener listener) { + this.computer = computer; + this.listener = listener; + } + + @Override + public boolean verifyServerHostKey(String hostname, int port, String serverHostKeyAlgorithm, byte[] serverHostKey) throws Exception { + SlaveTemplate template = computer.getSlaveTemplate(); + 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; + return EC2HostAddressProvider.unix(instance, strategy); + } + + private int waitCompletion(Session session) throws InterruptedException { + // I noticed that the exit status delivery often gets delayed. Wait up + // to 1 sec. + for (int i = 0; i < 10; i++) { + Integer r = session.getExitStatus(); + if (r != null) + return r; + Thread.sleep(100); + } + return -1; + } + + @Override + public Descriptor getDescriptor() { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationAdministrativeMonitor.java b/src/main/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationAdministrativeMonitor.java index 07536e2f2..9b42cb0aa 100644 --- a/src/main/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationAdministrativeMonitor.java +++ b/src/main/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationAdministrativeMonitor.java @@ -110,7 +110,7 @@ private boolean gatherInsecureTemplate(EC2Cloud cloud) { List templates = cloud.getTemplates(); for (SlaveTemplate template : templates) { // It's only for unix templates - if (!template.isUnixSlave()) { + if (!template.isUnixSlave() || !template.isMacSlave()) { continue; } diff --git a/src/main/resources/hudson/plugins/ec2/MacData/config.jelly b/src/main/resources/hudson/plugins/ec2/MacData/config.jelly new file mode 100644 index 000000000..0c9bd8c35 --- /dev/null +++ b/src/main/resources/hudson/plugins/ec2/MacData/config.jelly @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java b/src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java index 108514a5c..eb8b94f67 100644 --- a/src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java +++ b/src/test/java/hudson/plugins/ec2/ConfigurationAsCodeTest.java @@ -193,4 +193,66 @@ public void testAmi() throws Exception { expectedFilters = Collections.emptyList(); assertEquals(expectedFilters, slaveTemplate.getAmiFilters()); } + + @Test + @ConfiguredWithCode("MacData.yml") + public void testMacData() throws Exception { + final AmazonEC2Cloud ec2Cloud = (AmazonEC2Cloud) Jenkins.get().getCloud("ec2-production"); + assertNotNull(ec2Cloud); + assertTrue(ec2Cloud.isUseInstanceProfileForCredentials()); + + final List templates = ec2Cloud.getTemplates(); + assertEquals(1, templates.size()); + final SlaveTemplate slaveTemplate = templates.get(0); + assertEquals("ami-12345", slaveTemplate.getAmi()); + assertEquals("/Users/ec2-user", slaveTemplate.remoteFS); + + assertEquals("mac metal", slaveTemplate.getLabelString()); + assertEquals(2, slaveTemplate.getLabelSet().size()); + + assertTrue(ec2Cloud.canProvision(new LabelAtom("metal"))); + assertTrue(ec2Cloud.canProvision(new LabelAtom("mac"))); + + final AMITypeData amiType = slaveTemplate.getAmiType(); + assertTrue(amiType.isMac()); + assertTrue(amiType instanceof MacData); + final MacData macData = (MacData) amiType; + assertEquals("sudo", macData.getRootCommandPrefix()); + assertEquals("sudo -u jenkins", macData.getSlaveCommandPrefix()); + assertEquals("-fakeFlag", macData.getSlaveCommandSuffix()); + assertEquals("22", macData.getSshPort()); + } + + @Test + @ConfiguredWithCode("Mac.yml") + public void testMac() throws Exception { + final AmazonEC2Cloud ec2Cloud = (AmazonEC2Cloud) Jenkins.get().getCloud("ec2-staging"); + assertNotNull(ec2Cloud); + assertTrue(ec2Cloud.isUseInstanceProfileForCredentials()); + + final List templates = ec2Cloud.getTemplates(); + assertEquals(1, templates.size()); + final SlaveTemplate slaveTemplate = templates.get(0); + assertEquals("ami-5678", slaveTemplate.getAmi()); + assertEquals("/Users/jenkins", slaveTemplate.remoteFS); + + assertEquals("mac clear", slaveTemplate.getLabelString()); + assertEquals(2, slaveTemplate.getLabelSet().size()); + + assertTrue(ec2Cloud.canProvision(new LabelAtom("clear"))); + assertTrue(ec2Cloud.canProvision(new LabelAtom("mac"))); + + assertEquals(null, slaveTemplate.spotConfig); + } + + @Test + @ConfiguredWithCode("MacData.yml") + public void testMacCloudConfigAsCodeExport() throws Exception { + ConfiguratorRegistry registry = ConfiguratorRegistry.get(); + ConfigurationContext context = new ConfigurationContext(registry); + CNode clouds = getJenkinsRoot(context).get("clouds"); + String exported = toYamlString(clouds); + String expected = toStringFromYamlFile(this, "MacDataExport.yml"); + assertEquals(expected, exported); + } } diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java index 2ad772aaa..3622fdba7 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java @@ -645,4 +645,28 @@ public void testTenancy() throws Exception { SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,connectionStrategy,hostKeyVerificationStrategy,tenancy"); } + + @Test + public void testMacConfig() throws Exception { + String ami = "ami1"; + String description = "foo ami"; + + EC2Tag tag1 = new EC2Tag("name1", "value1"); + EC2Tag tag2 = new EC2Tag("name2", "value2"); + List tags = new ArrayList(); + tags.add(tag1); + tags.add(tag2); + + SlaveTemplate orig = new SlaveTemplate("ami-123", EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.Mac1Metal, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", null, null, 0, 0, null, "", true, false, "", false, "", false, false, false, ConnectionStrategy.PUBLIC_IP, -1, null, null, Tenancy.Default); + + List templates = new ArrayList(); + templates.add(orig); + + AmazonEC2Cloud ac = new AmazonEC2Cloud("us-east-1", false, "abc", "us-east-1", "ghi", "3", templates, null, null); + r.jenkins.clouds.add(ac); + + r.submit(r.createWebClient().goTo("configure").getFormByName("config")); + SlaveTemplate received = ((EC2Cloud) r.jenkins.clouds.iterator().next()).getTemplate(description); + r.assertEqualBeans(orig, received, "ami,zone,description,remoteFS,type,jvmopts,stopOnTerminate,securityGroups,subnetId,useEphemeralDevices,connectionStrategy,hostKeyVerificationStrategy,tenancy"); + } } diff --git a/src/test/resources/hudson/plugins/ec2/Mac.yml b/src/test/resources/hudson/plugins/ec2/Mac.yml new file mode 100644 index 000000000..9795f3d88 --- /dev/null +++ b/src/test/resources/hudson/plugins/ec2/Mac.yml @@ -0,0 +1,14 @@ +--- +jenkins: + clouds: + - amazonEC2: + cloudName: "staging" + useInstanceProfileForCredentials: true + privateKey: "${PRIVATE_KEY}" + templates: + - description: + ami: "ami-5678" + labelString: "mac clear" + type: "Mac1Metal" + remoteFS: "/Users/jenkins" + mode: "NORMAL" diff --git a/src/test/resources/hudson/plugins/ec2/MacData.yml b/src/test/resources/hudson/plugins/ec2/MacData.yml new file mode 100644 index 000000000..c63a7fe6b --- /dev/null +++ b/src/test/resources/hudson/plugins/ec2/MacData.yml @@ -0,0 +1,21 @@ +--- +jenkins: + clouds: + - amazonEC2: + cloudName: "production" + useInstanceProfileForCredentials: true + sshKeysCredentialsId: "random credentials id" + templates: + - description: + ami: "ami-12345" + labelString: "mac metal" + type: "Mac1Metal" + remoteFS: "/Users/ec2-user" + mode: "NORMAL" + tenancy: Host + amiType: + macData: + rootCommandPrefix: "sudo" + slaveCommandPrefix: "sudo -u jenkins" + slaveCommandSuffix: "-fakeFlag" + sshPort: "22" diff --git a/src/test/resources/hudson/plugins/ec2/MacDataExport.yml b/src/test/resources/hudson/plugins/ec2/MacDataExport.yml new file mode 100644 index 000000000..55b4c9f61 --- /dev/null +++ b/src/test/resources/hudson/plugins/ec2/MacDataExport.yml @@ -0,0 +1,32 @@ +- amazonEC2: + cloudName: "production" + region: "us-east-1" + sshKeysCredentialsId: "random credentials id" + templates: + - ami: "ami-12345" + amiType: + macData: + rootCommandPrefix: "sudo" + slaveCommandPrefix: "sudo -u jenkins" + slaveCommandSuffix: "-fakeFlag" + sshPort: "22" + associatePublicIp: false + connectBySSHProcess: false + connectionStrategy: PRIVATE_IP + deleteRootOnTermination: false + ebsOptimized: false + hostKeyVerificationStrategy: CHECK_NEW_SOFT + labelString: "mac metal" + maxTotalUses: -1 + minimumNumberOfInstances: 0 + minimumNumberOfSpareInstances: 0 + mode: NORMAL + monitoring: false + numExecutors: 1 + remoteFS: "/Users/ec2-user" + stopOnTerminate: false + t2Unlimited: false + tenancy: Host + type: Mac1Metal + useEphemeralDevices: false + useInstanceProfileForCredentials: true From 94fcc9878066f67708f7f19f752a5774ff0d7d20 Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Tue, 23 Mar 2021 13:56:36 +0530 Subject: [PATCH 23/26] Adding backword compatibility for useDedicatedTenancy --- .../hudson/plugins/ec2/EC2AbstractSlave.java | 3 +- .../hudson/plugins/ec2/EC2OndemandSlave.java | 2 +- .../hudson/plugins/ec2/SlaveTemplate.java | 3 +- src/main/java/hudson/plugins/ec2/Tenancy.java | 49 +++++++++++++++++++ .../plugins/ec2/util/EC2AgentConfig.java | 2 +- .../plugins/ec2/EC2AbstractSlaveTest.java | 1 - .../hudson/plugins/ec2/SlaveTemplateTest.java | 2 +- .../ec2/util/EC2AgentFactoryMockImpl.java | 2 +- 8 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 src/main/java/hudson/plugins/ec2/Tenancy.java diff --git a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java index a99740db6..254134edb 100644 --- a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java @@ -68,7 +68,6 @@ import com.amazonaws.services.ec2.model.StopInstancesRequest; import com.amazonaws.services.ec2.model.Tag; import com.amazonaws.services.ec2.model.TerminateInstancesRequest; -import com.amazonaws.services.ec2.model.Tenancy; /** * Slave running on EC2. @@ -179,7 +178,7 @@ public EC2AbstractSlave(String name, String instanceId, String templateDescripti public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) throws FormException, IOException { - this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, Tenancy.Default); + this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, Tenancy.backwardsCompatible(useDedicatedTenancy)); } @Deprecated diff --git a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java index e328db3b7..6b2feb2bc 100644 --- a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java @@ -55,7 +55,7 @@ public EC2OndemandSlave(String instanceId, String templateDescription, String re public EC2OndemandSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) throws FormException, IOException { - this(name, instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, Tenancy.Default); + this(name, instanceId, templateDescription, remoteFS, numExecutors, labelString, mode, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, publicDNS, privateDNS, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, Tenancy.backwardsCompatible(useDedicatedTenancy)); } @DataBoundConstructor diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index e6886924b..55b426b09 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -196,7 +196,6 @@ import com.amazonaws.services.ec2.model.Subnet; import com.amazonaws.services.ec2.model.Tag; import com.amazonaws.services.ec2.model.TagSpecification; -import com.amazonaws.services.ec2.model.Tenancy; import hudson.Extension; import hudson.Util; @@ -448,7 +447,7 @@ public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, Stri useEphemeralDevices, launchTimeoutStr, associatePublicIp, customDeviceMapping, connectBySSHProcess, monitoring, t2Unlimited, connectionStrategy, maxTotalUses, - nodeProperties, hostKeyVerificationStrategy, Tenancy.Default); + nodeProperties, hostKeyVerificationStrategy, Tenancy.backwardsCompatible(useDedicatedTenancy)); } @Deprecated diff --git a/src/main/java/hudson/plugins/ec2/Tenancy.java b/src/main/java/hudson/plugins/ec2/Tenancy.java new file mode 100644 index 000000000..030d2b7dc --- /dev/null +++ b/src/main/java/hudson/plugins/ec2/Tenancy.java @@ -0,0 +1,49 @@ +package hudson.plugins.ec2; + +public enum Tenancy { + Default("default"), + Dedicated("dedicated"), + Host("host"); + + private String value; + + private Tenancy(String value) { + this.value = value; + } + + public String toString() { + return this.value; + } + + public static Tenancy fromValue(String value) { + if (value != null && !"".equals(value)) { + Tenancy[] var1 = values(); + int var2 = var1.length; + + for(int var3 = 0; var3 < var2; ++var3) { + Tenancy enumEntry = var1[var3]; + if (enumEntry.toString().equals(value)) { + return enumEntry; + } + } + + throw new IllegalArgumentException("Cannot create enum from " + value + " value!"); + } else { + throw new IllegalArgumentException("Value cannot be null or empty!"); + } + } + + /** + * For backwards compatibility. + * @param useDedicatedTenancy whether or not to use a tenancy to establish a connection. + * @return an {@link Tenancy} based on provided parameters. + */ + public static Tenancy backwardsCompatible(boolean useDedicatedTenancy) { + if (useDedicatedTenancy) { + return Dedicated; + } else { + return Default; + } + } +} + diff --git a/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java b/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java index ef97b3f1f..e59c75966 100644 --- a/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java +++ b/src/main/java/hudson/plugins/ec2/util/EC2AgentConfig.java @@ -1,6 +1,6 @@ package hudson.plugins.ec2.util; -import com.amazonaws.services.ec2.model.Tenancy; +import hudson.plugins.ec2.Tenancy; import hudson.model.Node; import hudson.plugins.ec2.AMITypeData; import hudson.plugins.ec2.ConnectionStrategy; diff --git a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java index 47c113796..1ae4adaff 100644 --- a/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java +++ b/src/test/java/hudson/plugins/ec2/EC2AbstractSlaveTest.java @@ -1,6 +1,5 @@ package hudson.plugins.ec2; -import com.amazonaws.services.ec2.model.Tenancy; import hudson.slaves.NodeProperty; import hudson.model.Node; import java.util.ArrayList; diff --git a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java index 2ad772aaa..3d936f9fc 100644 --- a/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java +++ b/src/test/java/hudson/plugins/ec2/SlaveTemplateTest.java @@ -49,7 +49,7 @@ import hudson.plugins.ec2.SlaveTemplate.ProvisionOptions; import hudson.plugins.ec2.util.MinimumNumberOfInstancesTimeRangeConfig; import com.amazonaws.services.ec2.model.Reservation; -import com.amazonaws.services.ec2.model.Tenancy; +import hudson.plugins.ec2.Tenancy; import hudson.plugins.ec2.util.PrivateKeyHelper; import jenkins.model.Jenkins; diff --git a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java index 26dfcfcad..c54bd0004 100644 --- a/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java +++ b/src/test/java/hudson/plugins/ec2/util/EC2AgentFactoryMockImpl.java @@ -4,7 +4,7 @@ import java.util.List; import com.amazonaws.AmazonClientException; -import com.amazonaws.services.ec2.model.Tenancy; +import hudson.plugins.ec2.Tenancy; import hudson.Extension; import hudson.model.Computer; From 2ce82821690c8265406250430ebf4e2ab04a3eff Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Tue, 6 Apr 2021 00:02:59 +0530 Subject: [PATCH 24/26] fixing resolve conflict --- src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java index bf286b3d6..e6964ee06 100644 --- a/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2AbstractSlave.java @@ -180,13 +180,6 @@ public EC2AbstractSlave(String name, String instanceId, String templateDescripti this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, Tenancy.backwardsCompatible(useDedicatedTenancy)); } - @Deprecated - public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses) - throws FormException, IOException { - - this(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, Tenancy.backwardsCompatible(useDedicatedTenancy)); - } - @Deprecated public EC2AbstractSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, List tags, String cloudName, boolean usePrivateDnsName, boolean useDedicatedTenancy, int launchTimeout, AMITypeData amiType) throws FormException, IOException { @@ -400,6 +393,8 @@ public EC2Cloud getCloud() { return 240; case M5a24xlarge: return 240; + case Mac1Metal: + return 1; // We don't have a suggestion, but we don't want to fail completely // surely? default: From cd7f509520feea0910e446478a359998bec1ae7f Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Tue, 6 Apr 2021 00:20:32 +0530 Subject: [PATCH 25/26] Fixing build --- src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java index 3f03a561d..8bf9bf6f8 100644 --- a/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java +++ b/src/main/java/hudson/plugins/ec2/EC2OndemandSlave.java @@ -63,8 +63,8 @@ public EC2OndemandSlave(String name, String instanceId, String templateDescripti public EC2OndemandSlave(String name, String instanceId, String templateDescription, String remoteFS, int numExecutors, String labelString, Mode mode, String initScript, String tmpDir, List> nodeProperties, String remoteAdmin, String jvmopts, boolean stopOnTerminate, String idleTerminationMinutes, String publicDNS, String privateDNS, List tags, String cloudName, int launchTimeout, AMITypeData amiType, ConnectionStrategy connectionStrategy, int maxTotalUses, Tenancy tenancy) throws FormException, IOException { - super(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, amiType.isWindows() ? new EC2WindowsLauncher() - : new EC2UnixLauncher(), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, tenancy); + super(name, instanceId, templateDescription, remoteFS, numExecutors, mode, labelString, (amiType.isWindows() ? new EC2WindowsLauncher() : (amiType.isMac() ? new EC2MacLauncher(): + new EC2UnixLauncher())), new EC2RetentionStrategy(idleTerminationMinutes), initScript, tmpDir, nodeProperties, remoteAdmin, jvmopts, stopOnTerminate, idleTerminationMinutes, tags, cloudName, launchTimeout, amiType, connectionStrategy, maxTotalUses, tenancy); this.publicDNS = publicDNS; this.privateDNS = privateDNS; From 3e67a96eab20f5d9fe431cf9d040881ec8ec3bd8 Mon Sep 17 00:00:00 2001 From: ykhandelwal Date: Fri, 9 Apr 2021 23:07:41 +0530 Subject: [PATCH 26/26] renaming the mac slave to mac agent --- src/main/java/hudson/plugins/ec2/SlaveTemplate.java | 2 +- .../verifiers/SshHostKeyVerificationAdministrativeMonitor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java index ebb1516b1..4e6a4be57 100644 --- a/src/main/java/hudson/plugins/ec2/SlaveTemplate.java +++ b/src/main/java/hudson/plugins/ec2/SlaveTemplate.java @@ -1741,7 +1741,7 @@ public boolean isUnixSlave() { return amiType.isUnix(); } - public boolean isMacSlave() { + public boolean isMacAgent() { return amiType.isMac(); } diff --git a/src/main/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationAdministrativeMonitor.java b/src/main/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationAdministrativeMonitor.java index 9b42cb0aa..57e49f11f 100644 --- a/src/main/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationAdministrativeMonitor.java +++ b/src/main/java/hudson/plugins/ec2/ssh/verifiers/SshHostKeyVerificationAdministrativeMonitor.java @@ -110,7 +110,7 @@ private boolean gatherInsecureTemplate(EC2Cloud cloud) { List templates = cloud.getTemplates(); for (SlaveTemplate template : templates) { // It's only for unix templates - if (!template.isUnixSlave() || !template.isMacSlave()) { + if (!template.isUnixSlave() || !template.isMacAgent()) { continue; }