PageRenderTime 53ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/org/synyx/sybil/jenkins/service/JenkinsService.java

https://gitlab.com/kindfulkirby/sybil
Java | 221 lines | 152 code | 64 blank | 5 comment | 15 complexity | 41c54bd5b0bd2197f35a24f523093da6 MD5 | raw file
  1. package org.synyx.sybil.jenkins.service;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.context.annotation.Profile;
  6. import org.springframework.http.HttpEntity;
  7. import org.springframework.http.HttpMethod;
  8. import org.springframework.http.ResponseEntity;
  9. import org.springframework.scheduling.annotation.Scheduled;
  10. import org.springframework.stereotype.Service;
  11. import org.springframework.web.client.RestClientException;
  12. import org.springframework.web.client.RestTemplate;
  13. import org.synyx.sybil.LoadFailedException;
  14. import org.synyx.sybil.bricklet.output.ledstrip.service.LEDStripConnectionException;
  15. import org.synyx.sybil.bricklet.output.ledstrip.service.LEDStripNotFoundException;
  16. import org.synyx.sybil.bricklet.output.ledstrip.service.LEDStripService;
  17. import org.synyx.sybil.jenkins.JenkinsJob;
  18. import org.synyx.sybil.jenkins.JenkinsProperties;
  19. import org.synyx.sybil.jenkins.Status;
  20. import org.synyx.sybil.jenkins.StatusInformation;
  21. import org.synyx.sybil.jenkins.persistence.JenkinsConfigRepository;
  22. import org.synyx.sybil.jenkins.persistence.JobConfig;
  23. import org.synyx.sybil.jenkins.persistence.ServerConfig;
  24. import java.util.ArrayList;
  25. import java.util.Arrays;
  26. import java.util.HashMap;
  27. import java.util.List;
  28. import java.util.Map;
  29. import javax.annotation.PreDestroy;
  30. /**
  31. * JenkinsService.
  32. *
  33. * @author Tobias Theuer - theuer@synyx.de
  34. */
  35. @Service
  36. public class JenkinsService {
  37. private static final Logger LOG = LoggerFactory.getLogger(JenkinsService.class);
  38. private static final long SCHEDULED_TIME_IN_MS = 60000;
  39. private static final int DELAY_DIVISOR = 4;
  40. private final LEDStripService ledStripService;
  41. private final RestTemplate restTemplate;
  42. private final JenkinsConfigRepository jenkinsConfigRepository;
  43. @Autowired
  44. public JenkinsService(LEDStripService ledStripService, RestTemplate restTemplate,
  45. JenkinsConfigRepository jenkinsConfigRepository) {
  46. this.ledStripService = ledStripService;
  47. this.restTemplate = restTemplate;
  48. this.jenkinsConfigRepository = jenkinsConfigRepository;
  49. }
  50. @PreDestroy
  51. public void turnOffAllLEDStrips() {
  52. try {
  53. ledStripService.turnOffAllLEDStrips();
  54. } catch (LoadFailedException | LEDStripConnectionException exception) {
  55. handleError("Error turning off LED strips:", exception);
  56. }
  57. }
  58. private void handleError(String message, Exception exception) {
  59. LOG.error(message, exception);
  60. }
  61. @Profile("default")
  62. @Scheduled(initialDelay = SCHEDULED_TIME_IN_MS / DELAY_DIVISOR, fixedRate = SCHEDULED_TIME_IN_MS)
  63. public void runScheduled() {
  64. Map<String, HttpEntity<JenkinsProperties[]>> authorizations;
  65. Map<String, List<JobConfig>> jobConfigs;
  66. try {
  67. authorizations = loadAuthorizations();
  68. jobConfigs = jenkinsConfigRepository.loadJobConfigs();
  69. } catch (LoadFailedException exception) {
  70. handleError("Error loading Jenkins configuration:", exception);
  71. return;
  72. }
  73. List<String> servers = new ArrayList<>(authorizations.keySet());
  74. List<JenkinsJob> jobs;
  75. Map<String, StatusInformation> ledStripStatuses = new HashMap<>();
  76. for (String server : servers) {
  77. try {
  78. jobs = getJobsFromJenkins(server, authorizations.get(server));
  79. ledStripStatuses = getLEDStripStatusesFromJobs(jobs, jobConfigs.get(server), ledStripStatuses);
  80. } catch (RestClientException exception) {
  81. handleError("Error retrieving jobs from Jenkins:", exception);
  82. }
  83. }
  84. applyStatuses(ledStripStatuses);
  85. }
  86. private Map<String, HttpEntity<JenkinsProperties[]>> loadAuthorizations() {
  87. Map<String, HttpEntity<JenkinsProperties[]>> authorizations = new HashMap<>();
  88. for (ServerConfig serverConfig : jenkinsConfigRepository.loadServerConfigs()) {
  89. authorizations.put(serverConfig.getUrl(), serverConfig.getHeader());
  90. }
  91. return authorizations;
  92. }
  93. private List<JenkinsJob> getJobsFromJenkins(String server, HttpEntity<JenkinsProperties[]> authorization) {
  94. ResponseEntity<JenkinsProperties> response = restTemplate.exchange(server + "/api/json", HttpMethod.GET,
  95. authorization, JenkinsProperties.class);
  96. return Arrays.asList(response.getBody().getJobs());
  97. }
  98. private Map<String, StatusInformation> getLEDStripStatusesFromJobs(List<JenkinsJob> jobs,
  99. List<JobConfig> jobConfigs, Map<String, StatusInformation> ledStripStatuses) {
  100. if (jobConfigs == null) {
  101. return ledStripStatuses;
  102. }
  103. for (JenkinsJob job : jobs) {
  104. StatusInformation jobStatus = getStatusFromJob(job);
  105. List<String> ledStrips = getLedStripFromConfiguredJob(job, jobConfigs);
  106. if (ledStrips.isEmpty()) {
  107. continue;
  108. }
  109. for (String ledStrip : ledStrips) {
  110. ledStripStatuses.put(ledStrip, higherStatus(jobStatus, ledStripStatuses.get(ledStrip)));
  111. }
  112. }
  113. return ledStripStatuses;
  114. }
  115. private StatusInformation getStatusFromJob(JenkinsJob job) {
  116. StatusInformation statusInformation;
  117. switch (job.getColor()) {
  118. case "red":
  119. case "red_anime":
  120. statusInformation = new StatusInformation(job.getName(), Status.CRITICAL);
  121. break;
  122. case "yellow":
  123. case "yellow_anime":
  124. statusInformation = new StatusInformation(job.getName(), Status.WARNING);
  125. break;
  126. default:
  127. statusInformation = new StatusInformation(job.getName(), Status.OKAY);
  128. break;
  129. }
  130. return statusInformation;
  131. }
  132. private List<String> getLedStripFromConfiguredJob(JenkinsJob job, List<JobConfig> jobConfigs) {
  133. List<String> result = new ArrayList<>();
  134. for (JobConfig jobConfig : jobConfigs) {
  135. if (jobConfig.getName().equals(job.getName())) {
  136. result.add(jobConfig.getLedstrip());
  137. }
  138. }
  139. return result;
  140. }
  141. private StatusInformation higherStatus(StatusInformation newStatus, StatusInformation currentStatus) {
  142. if (currentStatus == null || newStatus.getStatus().ordinal() > currentStatus.getStatus().ordinal()) {
  143. return newStatus;
  144. } else {
  145. return currentStatus;
  146. }
  147. }
  148. private void applyStatuses(Map<String, StatusInformation> ledStripStatuses) {
  149. for (String ledStrip : ledStripStatuses.keySet()) {
  150. try {
  151. ledStripService.handleStatus(ledStrip, ledStripStatuses.get(ledStrip));
  152. } catch (LoadFailedException | LEDStripConnectionException | LEDStripNotFoundException exception) {
  153. handleError("Error setting status on LED strip:", exception);
  154. }
  155. }
  156. }
  157. }