diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml
new file mode 100644
index 00000000..9ac2968b
--- /dev/null
+++ b/.mvn/extensions.xml
@@ -0,0 +1,7 @@
+
+
+ io.jenkins.tools.incrementals
+ git-changelist-maven-extension
+ 1.4
+
+
diff --git a/.mvn/maven.config b/.mvn/maven.config
new file mode 100644
index 00000000..2a0299c4
--- /dev/null
+++ b/.mvn/maven.config
@@ -0,0 +1,2 @@
+-Pconsume-incrementals
+-Pmight-produce-incrementals
diff --git a/JenkinsWiki.adoc b/JenkinsWiki.adoc
index 8996e716..c5538d1f 100644
--- a/JenkinsWiki.adoc
+++ b/JenkinsWiki.adoc
@@ -40,6 +40,11 @@ termination"
[SpotinstPlugin-Versionhistory]
== Version history
+[SpotinstPlugin-Version2.2.16(Mar18,2024)]
+=== Version 2.2.16 (Mar 18, 2024)
+
+* AWS stateful groups: ignore stateful instances with no running instance
+
[SpotinstPlugin-Version2.2.15(Sep26,2023)]
=== Version 2.2.15 (Sep 26, 2023)
diff --git a/pom.xml b/pom.xml
index 8c8e2e9c..5c0d9730 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
spotinst
- 2.2.16-SNAPSHOT
+ ${revision}${changelist}
hpi
Spotinst plugin
@@ -33,13 +33,16 @@
- scm:git:git://github.com/jenkinsci/spotinst-plugin.git
- scm:git:git@github.com:jenkinsci/spotinst-plugin.git
- https://github.com/jenkinsci/spotinst-plugin
- HEAD
+ scm:git:git://github.com/${gitHubRepo}.git
+ scm:git:git@github.com:${gitHubRepo}.git
+ https://github.com/${gitHubRepo}
+ ${scmTag}
+ 2.2.16
+ -SNAPSHOT
+ jenkinsci/spotinst-plugin
2.222.4
8
diff --git a/src/main/java/hudson/plugins/spotinst/cloud/AwsSpotinstCloud.java b/src/main/java/hudson/plugins/spotinst/cloud/AwsSpotinstCloud.java
index 46ceebf2..e99032bf 100644
--- a/src/main/java/hudson/plugins/spotinst/cloud/AwsSpotinstCloud.java
+++ b/src/main/java/hudson/plugins/spotinst/cloud/AwsSpotinstCloud.java
@@ -306,14 +306,15 @@ private void syncGroupStatefulInstances() {
if (statefulInstancesResponse.isRequestSucceed()) {
List statefulInstances = statefulInstancesResponse.getValue();
- this.ssiByInstanceId = statefulInstances.stream().collect(
+ this.ssiByInstanceId = statefulInstances.stream().filter(statefulInstance -> StringUtils.isNotEmpty(
+ statefulInstance.getInstanceId())).collect(
Collectors.toMap(AwsStatefulInstance::getInstanceId, statefulInstance -> statefulInstance));
+ LOGGER.info("found {} running stateful instances for group {}", ssiByInstanceId.size(), groupId);
}
else {
LOGGER.error(String.format("Failed to get group %s stateful instances. Errors: %s", groupId,
statefulInstancesResponse.getErrors()));
}
-
}
private List handleNewAwsSpots(AwsScaleUpResult scaleUpResult, String label) {
diff --git a/src/main/java/hudson/plugins/spotinst/cloud/AzureSpotCloud.java b/src/main/java/hudson/plugins/spotinst/cloud/AzureSpotCloud.java
index bff19404..b17fab75 100644
--- a/src/main/java/hudson/plugins/spotinst/cloud/AzureSpotCloud.java
+++ b/src/main/java/hudson/plugins/spotinst/cloud/AzureSpotCloud.java
@@ -88,7 +88,7 @@ List scaleUp(ProvisionRequest request) {
@Override
protected BlResponse checkIsStatefulGroup() {
- return new BlResponse<>(false);
+ return new BlResponse<>(Boolean.FALSE);
}
@Override
diff --git a/src/main/java/hudson/plugins/spotinst/cloud/AzureSpotinstCloud.java b/src/main/java/hudson/plugins/spotinst/cloud/AzureSpotinstCloud.java
index 600ecf7a..3145304b 100644
--- a/src/main/java/hudson/plugins/spotinst/cloud/AzureSpotinstCloud.java
+++ b/src/main/java/hudson/plugins/spotinst/cloud/AzureSpotinstCloud.java
@@ -78,7 +78,7 @@ List scaleUp(ProvisionRequest request) {
@Override
protected BlResponse checkIsStatefulGroup() {
- return new BlResponse<>(false);
+ return new BlResponse<>(Boolean.FALSE);
}
@Override
diff --git a/src/main/java/hudson/plugins/spotinst/cloud/BaseSpotinstCloud.java b/src/main/java/hudson/plugins/spotinst/cloud/BaseSpotinstCloud.java
index f665b2a4..35aa1099 100644
--- a/src/main/java/hudson/plugins/spotinst/cloud/BaseSpotinstCloud.java
+++ b/src/main/java/hudson/plugins/spotinst/cloud/BaseSpotinstCloud.java
@@ -59,7 +59,7 @@ public abstract class BaseSpotinstCloud extends Cloud {
private SpotGlobalExecutorOverride globalExecutorOverride;
protected Integer pendingThreshold;
private GroupLockingManager groupLockingManager;
- private boolean isStatefulGroup;
+ private Boolean isStatefulGroup;
//endregion
//region Constructor
@@ -131,15 +131,7 @@ public BaseSpotinstCloud(String groupId, String labelString, String idleTerminat
groupLockingManager = new GroupLockingManager(groupId, accountId);
groupLockingManager.syncGroupController();
- BlResponse checkIsStatefulGroupResponse = checkIsStatefulGroup();
-
- if (checkIsStatefulGroupResponse.isSucceed()) {
- this.isStatefulGroup = checkIsStatefulGroupResponse.getResult();
- }
- else {
- LOGGER.warn("failed to get the group's details, currently referring to it as stateless");
- this.isStatefulGroup = false;
- }
+ initIsStatefulGroup();
}
//endregion
@@ -890,6 +882,18 @@ public Boolean removeInstance(String instanceId) {
protected abstract BlResponse checkIsStatefulGroup();
+ private void initIsStatefulGroup(){
+ BlResponse isStatefulResponse = checkIsStatefulGroup();
+
+ if (isStatefulResponse.isSucceed()) {
+ isStatefulGroup = isStatefulResponse.getResult();
+ }
+ else if (isStatefulGroup == null) {
+ LOGGER.warn("failed to get the group's details, currently referring to it as stateless");
+ isStatefulGroup = false;
+ }
+ }
+
public Boolean isStatefulGroup() {
return isStatefulGroup;
}
@@ -906,11 +910,7 @@ public void syncGroup() {
boolean isCloudReadyForGroupCommunication = isCloudReadyForGroupCommunication();
if (isCloudReadyForGroupCommunication) {
- BlResponse isStatefulResponse = checkIsStatefulGroup();
-
- if (isStatefulResponse.isSucceed()) {
- this.isStatefulGroup = isStatefulResponse.getResult();
- }
+ initIsStatefulGroup();
syncGroupInstances();
}
diff --git a/src/main/java/hudson/plugins/spotinst/cloud/GcpSpotinstCloud.java b/src/main/java/hudson/plugins/spotinst/cloud/GcpSpotinstCloud.java
index 53184cef..7f269bfa 100644
--- a/src/main/java/hudson/plugins/spotinst/cloud/GcpSpotinstCloud.java
+++ b/src/main/java/hudson/plugins/spotinst/cloud/GcpSpotinstCloud.java
@@ -101,7 +101,7 @@ List scaleUp(ProvisionRequest request) {
@Override
protected BlResponse checkIsStatefulGroup() {
- return new BlResponse<>(false);
+ return new BlResponse<>(Boolean.FALSE);
}
@Override