public void sendCancelMessage(String uuid) { if (uuid == null) { return; } Agent agent = agentSessions.get(uuid); if(agent != null) { agent.send(new Message(Action.cancelBuild)); } } }
void acknowledge(Message message) { String acknowledgementId = MessageEncoding.decodeData(message.getData(), String.class); LOG.debug("Acknowledging {}", acknowledgementId); callbacks.remove(acknowledgementId).call(); }
public void process(Agent agent, Message msg) throws Exception { try { processWithoutAcknowledgement(agent, msg); } finally { agent.send(new Message(Action.acknowledge, MessageEncoding.encodeData(msg.getAcknowledgementId()))); } }
@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 encodeAndDecodeMessageWithoutData() { byte[] msg = MessageEncoding.encodeMessage(new Message(Action.ping)); Message decoded = MessageEncoding.decodeMessage(new ByteArrayInputStream(msg)); assertThat(decoded.getAction(), is(Action.ping)); assertNull(decoded.getData()); assertEquals(decoded, MessageEncoding.decodeMessage(new ByteArrayInputStream(msg))); }
@Test public void encodeAndDecodeSetCookie() { byte[] msg = MessageEncoding.encodeMessage(new Message(Action.setCookie, MessageEncoding.encodeData("cookie"))); Message decoded = MessageEncoding.decodeMessage(new ByteArrayInputStream(msg)); assertThat(MessageEncoding.decodeData(decoded.getData(), String.class), is("cookie")); }
@Test public void shouldSendAgentRuntimeInfoWhenWorkIsCalled() throws Exception { when(sslInfrastructureService.isRegistered()).thenReturn(true); when(webSocketSessionHandler.isNotRunning()).thenReturn(false); ArgumentCaptor<Message> argumentCaptor = ArgumentCaptor.forClass(Message.class); agentController = createAgentController(); agentController.init(); agentController.work(); verify(webSocketSessionHandler).sendAndWaitForAcknowledgement(argumentCaptor.capture()); Message message = argumentCaptor.getValue(); assertThat(message.getAcknowledgementId(), notNullValue()); assertThat(message.getAction(), is(Action.ping)); assertThat(message.getData(), is(MessageEncoding.encodeData(agentController.getAgentRuntimeInfo()))); }
void process(Message message) throws InterruptedException { switch (message.getAction()) { case cancelBuild: cancelJobIfThereIsOneRunning(); break; case setCookie: String cookie = MessageEncoding.decodeData(message.getData(), String.class); getAgentRuntimeInfo().setCookie(cookie); LOG.info("Got cookie: {}", cookie); case assignWork: cancelJobIfThereIsOneRunning(); Work work = MessageEncoding.decodeWork(message.getData()); LOG.debug("Got work from server: [{}]", work.description()); runner = new JobRunner(); case build: cancelBuild(); BuildSettings buildSettings = MessageEncoding.decodeData(message.getData(), BuildSettings.class); runBuild(buildSettings); break; break; default: throw new RuntimeException("Unknown action: " + message.getAction());
private void sendWithCallback(Message message, MessageCallback callback) { callbacks.put(message.getAcknowledgementId(), callback); send(message); }
@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); }
public void processWithoutAcknowledgement(Agent agent, Message msg) throws Exception { switch (msg.getAction()) { case ping: AgentRuntimeInfo info = MessageEncoding.decodeData(msg.getData(), AgentRuntimeInfo.class); if (!sessionIds.containsKey(agent)) { LOGGER.info("{} is connected with websocket {}", info.getIdentifier(), agent); agent.send(new Message(Action.setCookie, MessageEncoding.encodeData(cookie))); agent.send(new Message(Action.cancelBuild)); Report report = MessageEncoding.decodeData(msg.getData(), Report.class); buildRepositoryRemote.reportCurrentStatus(report.getAgentRuntimeInfo(), findJobIdentifier(report), report.getJobState()); break; case reportCompleting: report = MessageEncoding.decodeData(msg.getData(), Report.class); buildRepositoryRemote.reportCompleting(report.getAgentRuntimeInfo(), findJobIdentifier(report), report.getResult()); break; case reportCompleted: report = MessageEncoding.decodeData(msg.getData(), Report.class); buildRepositoryRemote.reportCompleted(report.getAgentRuntimeInfo(), findJobIdentifier(report), report.getResult()); break; case consoleOut: ConsoleTransmission consoleTransmission = MessageEncoding.decodeData(msg.getData(), ConsoleTransmission.class); File consoleLogFile = consoleService.consoleLogFile(findJobIdentifier(consoleTransmission)); consoleService.updateConsoleLog(consoleLogFile, consoleTransmission.getLineAsStream()); break; default: throw new RuntimeException("Unknown action: " + msg.getAction());
@Test public void encodeAndDecodePingMessage() { AgentRuntimeInfo info = new AgentRuntimeInfo(new AgentIdentifier("hostName", "ipAddress", "uuid"), null, null, null, false); byte[] msg = MessageEncoding.encodeMessage(new Message(Action.ping, MessageEncoding.encodeData(info))); Message decoded = MessageEncoding.decodeMessage(new ByteArrayInputStream(msg)); AgentRuntimeInfo decodedInfo = MessageEncoding.decodeData(decoded.getData(), AgentRuntimeInfo.class); assertThat(decodedInfo.getIdentifier(), is(info.getIdentifier())); }
BuildCommand.reportCurrentStatus(JobState.Building))); agentController.process(new Message(Action.build, MessageEncoding.encodeData(build))); assertThat(message.getAcknowledgementId(), notNullValue()); assertThat(message.getAction(), is(Action.reportCurrentStatus)); assertThat(message.getData(), is(MessageEncoding.encodeData(new Report(agentRuntimeInfo, "b001", JobState.Building, null)))); assertThat(jobCompletedMessage.getAcknowledgementId(), notNullValue()); assertThat(jobCompletedMessage.getAction(), is(Action.reportCompleted)); assertThat(jobCompletedMessage.getData(), is(MessageEncoding.encodeData(new Report(agentRuntimeInfo, "b001", null, JobResult.Passed))));
@Override public void taggedConsumeLine(String tag, String line, JobIdentifier jobIdentifier) { ConsoleTransmission consoleTransmission = new ConsoleTransmission(tag, line, jobIdentifier); webSocketSessionHandler.sendAndWaitForAcknowledgement(new Message(Action.consoleOut, MessageEncoding.encodeData(consoleTransmission))); } }
@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")); }
@Override public void run() { handler.acknowledge(new Message(Action.acknowledge, message.getAcknowledgementId())); } }));
BuildCommand.reportCurrentStatus(JobState.Building))); agentController.process(new Message(Action.build, MessageEncoding.encodeData(build))); assertThat(consoleOutMsg.getAcknowledgementId(), notNullValue()); assertThat(consoleOutMsg.getAction(), is(Action.consoleOut)); ConsoleTransmission ct = MessageEncoding.decodeData(consoleOutMsg.getData(), ConsoleTransmission.class); assertThat(ct.getLine(), RegexMatcher.matches("building")); assertEquals(ct.getBuildId(), "b001"); assertThat(message.getAcknowledgementId(), notNullValue()); assertThat(message.getAction(), is(Action.reportCurrentStatus)); assertThat(message.getData(), is(MessageEncoding.encodeData(new Report(agentRuntimeInfo, "b001", JobState.Building, null)))); assertThat(jobCompletedMessage.getAcknowledgementId(), notNullValue()); assertThat(jobCompletedMessage.getAction(), is(Action.reportCompleted)); assertThat(jobCompletedMessage.getData(), is(MessageEncoding.encodeData(new Report(agentRuntimeInfo, "b001", null, JobResult.Passed))));
@Override public void taggedConsumeLine(String tag, String line) { ConsoleTransmission transmission = new ConsoleTransmission(tag, line, buildId); this.webSocketSessionHandler.sendAndWaitForAcknowledgement(new Message(Action.consoleOut, MessageEncoding.encodeData(transmission))); } }
agentController.process(new Message(Action.cancelBuild)); buildingThread.join(MAX_WAIT_IN_TEST); assertThat(message.getAcknowledgementId(), notNullValue()); assertThat(message.getAction(), is(Action.reportCompleted)); assertThat(message.getData(), is(MessageEncoding.encodeData(new Report(agentRuntimeInfo, "b001", null, JobResult.Cancelled))));
@Override public void reportCurrentStatus(AgentRuntimeInfo agentRuntimeInfo, JobIdentifier jobIdentifier, JobState jobState) { Report report = new Report(agentRuntimeInfo, jobIdentifier, jobState); webSocketSessionHandler.sendAndWaitForAcknowledgement(new Message(Action.reportCurrentStatus, MessageEncoding.encodeData(report))); }