@Override public void run() { try { agentController.process(new Message(Action.assignWork, MessageEncoding.encodeWork(work1))); } catch (InterruptedException e) { throw new RuntimeException(e); } } });
@Override public void run() { try { agentController.process(new Message(Action.assignWork, MessageEncoding.encodeWork(sleep1secWork))); } catch (InterruptedException e) { throw new RuntimeException(e); } } });
private void matchingJobForRegisteredAgents() { Map<String, Agent> agents = agentRemoteHandler.connectedAgents(); if (agents.isEmpty()) { return; } Long start = System.currentTimeMillis(); for (Map.Entry<String, Agent> entry : agents.entrySet()) { String agentUUId = entry.getKey(); Agent agent = entry.getValue(); AgentInstance agentInstance = agentService.findAgentAndRefreshStatus(agentUUId); if (!agentInstance.isRegistered()) { agent.send(new Message(Action.reregister)); continue; } if (agentInstance.isDisabled() || !agentInstance.isIdle()) { LOGGER.debug("Ignore agent [{}] that is {} and {}", agentInstance.getAgentIdentifier(), agentInstance.getRuntimeStatus(), agentInstance.getAgentConfigStatus()); continue; } Work work = assignWorkToAgent(agentInstance); if (work != NO_WORK) { if (agentInstance.getSupportsBuildCommandProtocol()) { BuildSettings buildSettings = createBuildSettings(((BuildWork) work).getAssignment()); agent.send(new Message(Action.build, MessageEncoding.encodeData(buildSettings))); } else { agent.send(new Message(Action.assignWork, MessageEncoding.encodeWork(work))); } } } LOGGER.debug("Matching {} agents with {} jobs took: {}ms", agents.size(), jobPlans.size(), System.currentTimeMillis() - start); }
@Test public void processAssignWorkAction() throws IOException, InterruptedException { ArgumentCaptor<Message> argumentCaptor = ArgumentCaptor.forClass(Message.class); agentController = createAgentController(); agentController.init(); agentController.process(new Message(Action.assignWork, MessageEncoding.encodeWork(new SleepWork("work1", 0)))); assertThat(agentController.getAgentRuntimeInfo().getRuntimeStatus(), is(AgentRuntimeStatus.Idle)); verify(webSocketSessionHandler, times(1)).sendAndWaitForAcknowledgement(argumentCaptor.capture()); verify(artifactsManipulator).setProperty(null, new Property("work1_result", "done")); Message message = argumentCaptor.getAllValues().get(0); assertThat(message.getAcknowledgementId(), notNullValue()); assertThat(message.getAction(), is(Action.ping)); assertThat(message.getData(), is(MessageEncoding.encodeData(agentController.getAgentRuntimeInfo()))); }
@Test public void shouldCancelPreviousRunningJobIfANewAssignWorkMessageIsReceived() throws IOException, InterruptedException { agentController = createAgentController(); agentController.init(); final SleepWork work1 = new SleepWork("work1", MAX_WAIT_IN_TEST); Thread work1Thread = new Thread(new Runnable() { @Override public void run() { try { agentController.process(new Message(Action.assignWork, MessageEncoding.encodeWork(work1))); } catch (InterruptedException e) { throw new RuntimeException(e); } } }); work1Thread.start(); waitForAgentRuntimeState(agentController.getAgentRuntimeInfo(), AgentRuntimeStatus.Building); SleepWork work2 = new SleepWork("work2", 1); agentController.process(new Message(Action.assignWork, MessageEncoding.encodeWork(work2))); work1Thread.join(MAX_WAIT_IN_TEST); verify(artifactsManipulator).setProperty(null, new Property("work1_result", "done_canceled")); verify(artifactsManipulator).setProperty(null, new Property("work2_result", "done")); }
@Test public void processAssignWorkActionWithConsoleLogsThroughWebSockets() throws IOException, InterruptedException { SystemEnvironment env = new SystemEnvironment(); env.set(SystemEnvironment.WEBSOCKET_ENABLED, true); env.set(SystemEnvironment.CONSOLE_LOGS_THROUGH_WEBSOCKET_ENABLED, true); ArgumentCaptor<Message> argumentCaptor = ArgumentCaptor.forClass(Message.class); agentController = createAgentController(); agentController.init(); agentController.process(new Message(Action.assignWork, MessageEncoding.encodeWork(new SleepWork("work1", 0)))); assertThat(agentController.getAgentRuntimeInfo().getRuntimeStatus(), is(AgentRuntimeStatus.Idle)); verify(webSocketSessionHandler, times(2)).sendAndWaitForAcknowledgement(argumentCaptor.capture()); verify(artifactsManipulator).setProperty(null, new Property("work1_result", "done")); Message message = argumentCaptor.getAllValues().get(1); assertThat(message.getAcknowledgementId(), notNullValue()); assertThat(message.getAction(), is(Action.ping)); assertThat(message.getData(), is(MessageEncoding.encodeData(agentController.getAgentRuntimeInfo()))); Message message2 = argumentCaptor.getAllValues().get(0); assertThat(message2.getAcknowledgementId(), notNullValue()); assertThat(message2.getAction(), is(Action.consoleOut)); ConsoleTransmission ct = MessageEncoding.decodeData(message2.getData(), ConsoleTransmission.class); assertThat(ct.getLine(), RegexMatcher.matches("Sleeping for 0 milliseconds")); env.set(SystemEnvironment.WEBSOCKET_ENABLED, false); env.set(SystemEnvironment.CONSOLE_LOGS_THROUGH_WEBSOCKET_ENABLED, false); }
@Test public void encodeAndDecodeAssignWorkWithDifferentBuilders() throws Exception { File workingDir = new File(CruiseConfig.WORKING_BASE_DIR + "pipelineName"); Materials materials = MaterialsMother.defaultMaterials(); MaterialRevisions revisions = ModificationsMother.modifyOneFile(materials, ModificationsMother.nextRevision()); BuildCause buildCause = BuildCause.createWithModifications(revisions, ""); List<Builder> builder = new ArrayList<>(); builder.add(new CommandBuilder("command", "args", workingDir, new RunIfConfigs(), new NullBuilder(), "desc")); builder.add(new BuilderForKillAllChildTask()); builder.add(new CommandBuilderWithArgList("command", new String[]{"arg1", "arg2"}, workingDir, new RunIfConfigs(), new NullBuilder(), "desc")); builder.add(new FetchArtifactBuilder(new RunIfConfigs(), new NullBuilder(), "desc", jobPlan().getIdentifier(), "srcdir", "dest", new FileHandler(workingDir, "src"), new ChecksumFileHandler(workingDir))); BuildAssignment assignment = BuildAssignment.create(jobPlan(), buildCause, builder, workingDir, new EnvironmentVariableContext(), new ArtifactStores()); BuildWork work = new BuildWork(assignment, "utf-8"); byte[] msg = MessageEncoding.encodeMessage(new Message(Action.assignWork, MessageEncoding.encodeWork(work))); Message decodedMsg = MessageEncoding.decodeMessage(new ByteArrayInputStream(msg)); BuildWork decodedWork = (BuildWork) MessageEncoding.decodeWork(decodedMsg.getData()); assertThat(decodedWork.getAssignment().getJobIdentifier().getPipelineName(), is("pipelineName")); }