Skip to content

Commit 8fbae5f

Browse files
committed
Checks for outstanding pod creation requests so that we don't create extraneous pods
1 parent a10288d commit 8fbae5f

File tree

4 files changed

+44
-9
lines changed

4 files changed

+44
-9
lines changed

src/main/java/cd/go/contrib/elasticagent/KubernetesAgentInstances.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package cd.go.contrib.elasticagent;
1818

19+
import cd.go.contrib.elasticagent.model.JobIdentifier;
1920
import cd.go.contrib.elasticagent.requests.CreateAgentRequest;
2021
import io.fabric8.kubernetes.api.model.Pod;
2122
import io.fabric8.kubernetes.api.model.PodList;
@@ -55,13 +56,29 @@ public KubernetesAgentInstances(KubernetesClientFactory factory, KubernetesInsta
5556

5657
@Override
5758
public KubernetesInstance create(CreateAgentRequest request, PluginSettings settings, PluginRequest pluginRequest) throws Exception {
59+
JobIdentifier jobIdentifier = request.jobIdentifier();
60+
if (isAgentCreatedForJob(jobIdentifier.getJobId())) {
61+
LOG.warn("[Create Agent Request] Request for creating an agent for Job Identifier [" + jobIdentifier + "] has already been scheduled. Skipping current request.");
62+
return null;
63+
}
64+
5865
KubernetesClient client = factory.kubernetes(settings);
5966
KubernetesInstance instance = kubernetesInstanceFactory.create(request, settings, client, pluginRequest, isUsingPodYaml(request));
6067
register(instance);
6168

6269
return instance;
6370
}
6471

72+
private boolean isAgentCreatedForJob(Long jobId) {
73+
for (KubernetesInstance instance : instances.values()) {
74+
if (instance.jobId().equals(jobId)) {
75+
return true;
76+
}
77+
}
78+
79+
return false;
80+
}
81+
6582
private boolean isUsingPodYaml(CreateAgentRequest request) {
6683
return Boolean.valueOf(request.properties().get(SPECIFIED_USING_POD_CONFIGURATION.getKey()));
6784
}
@@ -133,10 +150,6 @@ public KubernetesInstance find(String agentId) {
133150
return instances.get(agentId);
134151
}
135152

136-
public boolean hasInstance(String agentId) {
137-
return instances.containsKey(agentId);
138-
}
139-
140153
private void register(KubernetesInstance instance) {
141154
instances.put(instance.name(), instance);
142155
}

src/main/java/cd/go/contrib/elasticagent/KubernetesInstance.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,8 @@ public String environment() {
5656
public Map<String, String> getInstanceProperties() {
5757
return properties;
5858
}
59+
60+
public Long jobId() {
61+
return jobId;
62+
}
5963
}

src/test/java/cd/go/contrib/elasticagent/KubernetesAgentInstancesTest.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ public class KubernetesAgentInstancesTest {
5151
@Mock
5252
PluginRequest mockPluginRequest;
5353

54-
@Mock
55-
PodOperationsImpl mockPods;
5654
private HashMap<String, String> testProperties;
5755

5856
@Before
@@ -61,11 +59,13 @@ public void setUp() throws Exception {
6159
testProperties = new HashMap<>();
6260
when(mockCreateAgentRequest.properties()).thenReturn(testProperties);
6361
when(factory.kubernetes(mockPluginSettings)).thenReturn(mockKubernetesClient);
62+
JobIdentifier jobId = new JobIdentifier("test", 1L, "Test pipeline", "test name", "1", "test job", 100L);
63+
when(mockCreateAgentRequest.jobIdentifier()).thenReturn(jobId);
6464
}
6565

6666
@Test
6767
public void shouldCreateKubernetesPodUsingPodYamlAndCacheCreatedInstance() throws Exception {
68-
KubernetesInstance kubernetesInstance = new KubernetesInstance(new DateTime(), "test", "test-agent", new HashMap<>(), null);
68+
KubernetesInstance kubernetesInstance = new KubernetesInstance(new DateTime(), "test", "test-agent", new HashMap<>(), 100L);
6969
when(mockKubernetesInstanceFactory.create(mockCreateAgentRequest, mockPluginSettings, mockKubernetesClient, mockPluginRequest, true)).
7070
thenReturn(kubernetesInstance);
7171

@@ -78,12 +78,30 @@ public void shouldCreateKubernetesPodUsingPodYamlAndCacheCreatedInstance() throw
7878

7979
@Test
8080
public void shouldCreateKubernetesPodAndCacheCreatedInstance() throws Exception {
81-
KubernetesInstance kubernetesInstance = new KubernetesInstance(new DateTime(), "test", "test-agent", new HashMap<>(), null);
81+
KubernetesInstance kubernetesInstance = new KubernetesInstance(new DateTime(), "test", "test-agent", new HashMap<>(), 100L);
8282
when(mockKubernetesInstanceFactory.create(mockCreateAgentRequest, mockPluginSettings, mockKubernetesClient, mockPluginRequest, false)).
8383
thenReturn(kubernetesInstance);
8484
testProperties.put("SpecifiedUsingPodConfiguration", "false");
8585
KubernetesAgentInstances agentInstances = new KubernetesAgentInstances(factory, mockKubernetesInstanceFactory);
8686
KubernetesInstance instance = agentInstances.create(mockCreateAgentRequest, mockPluginSettings, mockPluginRequest);
8787
assertTrue(agentInstances.instanceExists(instance));
8888
}
89+
90+
@Test
91+
public void shouldNotCreatePodWhenOutstandingRequestsExistForJobs() throws Exception {
92+
KubernetesInstance kubernetesInstance = new KubernetesInstance(new DateTime(), "test", "test-agent", new HashMap<>(), 100L);
93+
when(mockKubernetesInstanceFactory.create(mockCreateAgentRequest, mockPluginSettings, mockKubernetesClient, mockPluginRequest, false)).
94+
thenReturn(kubernetesInstance);
95+
testProperties.put("SpecifiedUsingPodConfiguration", "false");
96+
97+
KubernetesAgentInstances agentInstances = new KubernetesAgentInstances(factory, mockKubernetesInstanceFactory);
98+
JobIdentifier jobId = new JobIdentifier("test", 1L, "Test pipeline", "test name", "1", "test job", 100L);
99+
when(mockCreateAgentRequest.jobIdentifier()).thenReturn(jobId);
100+
agentInstances.create(mockCreateAgentRequest, mockPluginSettings, mockPluginRequest);
101+
verify(mockKubernetesInstanceFactory, times(1)).create(any(), any(), any(), any(), any());
102+
reset(mockKubernetesInstanceFactory);
103+
104+
agentInstances.create(mockCreateAgentRequest, mockPluginSettings, mockPluginRequest);
105+
verify(mockKubernetesInstanceFactory, times(0)).create(any(), any(), any(), any(), any());
106+
}
89107
}

src/test/java/cd/go/contrib/elasticagent/executors/ServerPingRequestExecutorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public void testShouldTerminateInstancesThatNeverAutoRegistered() throws Excepti
131131
verifyNoMoreInteractions(pluginRequest);
132132

133133
new ServerPingRequestExecutor(agentInstances, pluginRequest).execute();
134-
assertFalse(agentInstances.hasInstance(container.name()));
134+
assertFalse(agentInstances.instanceExists(container));
135135
}
136136

137137
@Test

0 commit comments

Comments
 (0)