public boolean isListeningFor(Material material) { return pendingMaterials.containsKey(material.getFingerprint()); } }
public MaterialRevision filter(MaterialRevision previous) { if (modifications.shouldBeIgnoredByFilterIn(material.config())) { return previous; } else { return this; } }
public Material byFolder(String folder) { for (Material material : this) { if ((material instanceof ScmMaterial || material instanceof PluggableSCMMaterial) && Objects.equals(folder, material.getFolder())) { return material; } } return null; }
public long materialSentToUpdateQueue(Material material) { long trackingId = currentTrackingId++; performanceLogger.log("MDU-QUEUE-PUT {} {} {}", trackingId, material.getFingerprint(), material.getDisplayName()); return trackingId; }
public ValueStreamMap(Material material, MaterialInstance materialInstance, Modification modification) { currentMaterial = new SCMDependencyNode(material.getFingerprint(), material.getUriForDisplay(), material.getTypeForDisplay()); currentMaterialInstance = materialInstance; nodeIdToNodeMap.put(currentMaterial.getId(), currentMaterial); ((SCMDependencyNode)currentMaterial).addMaterialRevision(new MaterialRevision(material, false, modification)); }
public boolean updateMaterial(Material material) { Date inProgressSince = inProgress.putIfAbsent(material, new Date()); if (inProgressSince == null || !material.isAutoUpdate()) { LOGGER.debug("[Material Update] Starting update of material {}", material); try { long trackingId = mduPerformanceLogger.materialSentToUpdateQueue(material); queueFor(material).post(new MaterialUpdateMessage(material, trackingId)); return true; } catch (RuntimeException e) { inProgress.remove(material); throw e; } } else { LOGGER.warn("[Material Update] Skipping update of material {} which has been in-progress since {}", material, inProgressSince); long idleTime = getProcessManager().getIdleTimeFor(material.getFingerprint()); if (idleTime > getMaterialUpdateInActiveTimeoutInMillis()) { HealthStateScope scope = HealthStateScope.forMaterialUpdate(material); serverHealthService.removeByScope(scope); serverHealthService.update(warning("Material update for " + material.getUriForDisplay() + " hung:", "Material update is currently running but has not shown any activity in the last " + idleTime / 60000 + " minute(s). This may be hung. Details - " + material.getLongDescription(), general(scope))); } return false; } }
private void traverseUpstream(CaseInsensitiveString pipelineName, BuildCause buildCause, ValueStreamMap graph, List<MaterialRevision> visitedNodes) { for (MaterialRevision materialRevision : buildCause.getMaterialRevisions()) { Material material = materialRevision.getMaterial(); if (material instanceof DependencyMaterial) { CaseInsensitiveString upstreamPipeline = ((DependencyMaterial) material).getPipelineName(); DependencyMaterialRevision revision = (DependencyMaterialRevision) materialRevision.getRevision(); graph.addUpstreamNode(new PipelineDependencyNode(upstreamPipeline, upstreamPipeline.toString()), new PipelineRevision(revision.getPipelineName(), revision.getPipelineCounter(), revision.getPipelineLabel()), pipelineName); if (visitedNodes.contains(materialRevision)) { continue; } visitedNodes.add(materialRevision); DependencyMaterialRevision dmrOfUpstreamPipeline = buildCause.getMaterialRevisions().findDependencyMaterialRevision(upstreamPipeline.toString()); BuildCause buildCauseForUpstreamPipeline = pipelineService.buildCauseFor(dmrOfUpstreamPipeline.getPipelineName(), dmrOfUpstreamPipeline.getPipelineCounter()); traverseUpstream(upstreamPipeline, buildCauseForUpstreamPipeline, graph, visitedNodes); } else { graph.addUpstreamMaterialNode(new SCMDependencyNode(material.getFingerprint(), material.getUriForDisplay(), materialRevision.getMaterialType()), material.getName(), pipelineName, materialRevision); } } }
@Theory public void shouldBeSameObject_WhenConversionIsDoneFromMaterialConfigToMaterialAndBack(MaterialConfig materialConfig) throws Exception { Material materialFromConfig = materialConfigConverter.toMaterial(materialConfig); MaterialConfig materialConfigConvertedBackFromMaterial = materialFromConfig.config(); assertThat(materialConfigConvertedBackFromMaterial, is(materialConfig)); assertTrue(message("Material <-> MaterialConfig conversion failed.", materialConfigConvertedBackFromMaterial, materialConfig), reflectionEquals(materialConfigConvertedBackFromMaterial, materialConfig)); assertThat(materialFromConfig.getFingerprint(), is(materialConfig.getFingerprint())); assertThat(materialFromConfig.isAutoUpdate(), is(materialConfig.isAutoUpdate())); assertThat(materialConfigConvertedBackFromMaterial.getFingerprint(), is(materialConfig.getFingerprint())); assertPasswordIsCorrect(materialConfig); assertPasswordIsCorrect(materialFromConfig); assertPasswordIsCorrect(materialConfigConvertedBackFromMaterial); }
LOGGER.error("not scheduling pipeline {} after manual-trigger because update of material failed with reason {}", pipelineConfig.name(), failureReason); showError(CaseInsensitiveString.str(pipelineConfig.name()), format("Could not trigger pipeline '%s'", pipelineConfig.name()), format("Material update failed for material '%s' because: %s", material.getDisplayName(), failureReason)); failed = true; } else if (this.configMaterial != null && material.isSameFlyweight(this.configMaterial)) { format("Pipeline '%s' configuration has been removed from %s", pipelineConfig.name(), configMaterial.getDisplayName())); failed = true; } else { LOGGER.info("new material {} in {} was added after manual-trigger. Scheduled update for it.", newMaterial.getDisplayName(), pipelineConfig.name()); pendingMaterials.remove(material.getFingerprint());
private void invalidateCacheConditionallyForPipelineInstancesTriggeredWithDependencyMaterial(Pipeline pipeline) { BuildCause buildCause = pipeline.getBuildCause(); for (MaterialRevision materialRevision : buildCause.getMaterialRevisions()) { if (DependencyMaterial.TYPE.equals(materialRevision.getMaterial().getType())) { DependencyMaterialRevision dependencyMaterialRevision = (DependencyMaterialRevision) materialRevision.getRevision(); goCache.remove(cacheKeyForPipelineInstancesTriggeredWithDependencyMaterial(pipeline.getName(), dependencyMaterialRevision.getPipelineName(), dependencyMaterialRevision.getPipelineCounter())); } else { goCache.remove(cacheKeyForPipelineInstancesTriggeredWithDependencyMaterial(pipeline.getName(), materialRevision.getMaterial().getFingerprint(), materialRevision.getRevision().getRevision())); } } }
@Theory public void shouldBeSameObject_WhenConversionIsDoneFromMaterialToMaterialInstanceAndBack(MaterialConfig materialConfig) throws Exception { Material material = materialConfigConverter.toMaterial(materialConfig); MaterialInstance materialInstance = material.createMaterialInstance(); Material materialConvertedBackFromInstance = materialInstance.toOldMaterial(materialConfig.getName().toString(), materialConfig.getFolder(), "pass"); assertTrue(message("Material <-> MaterialInstance conversion failed.", material, materialConvertedBackFromInstance), reflectionEquals(material, materialConvertedBackFromInstance, fieldsWhichShouldBeIgnoredWhenSavedInDbAndGotBack.get(materialConfig.getClass()))); assertThat(materialInstance.getFingerprint(), is(material.getFingerprint())); assertThat(materialConvertedBackFromInstance.getFingerprint(), is(materialInstance.getFingerprint())); assertPasswordIsCorrect(material); assertPasswordIsCorrect(materialConvertedBackFromInstance); }
private ArrayList<StageNotificationDTO.MaterialRevisionDTO> createBuildCause(BuildCause buildCause) { ArrayList<StageNotificationDTO.MaterialRevisionDTO> revisions = new ArrayList<>(); for (MaterialRevision currentRevision : buildCause.getMaterialRevisions()) { Map<String, Object> attributes = currentRevision.getMaterial().getAttributes(false); attributes.put("fingerprint", currentRevision.getMaterial().getFingerprint()); ArrayList<StageNotificationDTO.ModificationDTO> modifications = new ArrayList<>(); for (Modification modification : currentRevision.getModifications()) { modifications.add(new StageNotificationDTO.ModificationDTO(modification.getRevision(), DateUtil.dateToString(modification.getModifiedTime()), modification.getAdditionalDataMap())); } revisions.add(new StageNotificationDTO.MaterialRevisionDTO(attributes, currentRevision.isChanged(), modifications)); } return revisions; } }
public PipelineMaterialRevision(long pipelineId, MaterialRevision revision, Long actualFromModificationId) { this(CaseInsensitiveString.str(revision.getMaterial().getName()), revision.getMaterial().getFolder(), pipelineId, revision.getOldestModification(), revision.getLatestModification(), revision.isChanged(), actualFromModificationId); recomputeFromModification(revision.getMaterial()); }
@SuppressWarnings("unchecked") public List<MatchedRevision> findRevisionsMatching(final MaterialConfig materialConfig, final String searchString) { return (List<MatchedRevision>) getHibernateTemplate().execute((HibernateCallback) session -> { String sql = "SELECT m.*" + " FROM modifications AS m" + " INNER JOIN materials mat ON mat.id = m.materialId" + " WHERE mat.fingerprint = :finger_print" + " AND (m.revision || ' ' || COALESCE(m.username, '') || ' ' || COALESCE(m.comment, '') LIKE :search_string OR m.pipelineLabel LIKE :search_string)" + " ORDER BY m.id DESC" + " LIMIT 5"; SQLQuery query = session.createSQLQuery(sql); query.addEntity("m", Modification.class); Material material = materialConfigConverter.toMaterial(materialConfig); query.setString("finger_print", material.getFingerprint()); query.setString("search_string", "%" + searchString + "%"); final List<MatchedRevision> list = new ArrayList<>(); for (Modification mod : (List<Modification>) query.list()) { list.add(material.createMatchedRevision(mod, searchString)); } return list; }); }
private boolean hasSameMaterialName(Material material, PipelineMaterialRevision pmr) { if (material.getName() == null && pmr.getMaterialName() == null) { return true; } if (material.getName() == null && pmr.getMaterialName() != null) { return false; } return material.getName().equals(new CaseInsensitiveString(pmr.getMaterialName())); }
public String getMaterialName() { return material.getDisplayName(); }
public String getLatestShortRevision() { return material.getShortRevision(getLatestRevisionString()); }
public Pipeline pipelineWithPasswordAwareBuildCauseByBuildId(final long buildId) { Pipeline pipeline = pipelineDao.pipelineWithMaterialsAndModsByBuildId(buildId); MaterialRevisions scheduledRevs = pipeline.getBuildCause().getMaterialRevisions(); MaterialConfigs knownMaterials = knownMaterials(pipeline, scheduledRevs); for (MaterialRevision materialRevision : scheduledRevs) { MaterialConfig materialConfig = materialFrom(knownMaterials, materialRevision); Material usedMaterial = materialRevision.getMaterial(); if (materialConfig == null) { final JobInstance jobInstance = jobInstanceService.buildByIdWithTransitions(buildId); scheduleService.failJob(jobInstance); final String message = "Cannot load job '" + jobInstance.buildLocator() + "' because material " + usedMaterial.config() + " was not found in config."; final String description = "Job for pipeline '" + jobInstance.buildLocator() + "' has been failed as one or more material configurations were either changed or removed."; transactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void afterCommit() { final ServerHealthState error = ServerHealthState.error(message, description, HealthStateType.general(HealthStateScope.forJob(jobInstance.getPipelineName(), jobInstance.getStageName(), jobInstance.getName()))); error.setTimeout(Timeout.FIVE_MINUTES); serverHealthService.update(error); appendToConsoleLog(jobInstance, message); appendToConsoleLog(jobInstance, description); } }); throw new StaleMaterialsOnBuildCause(message); } usedMaterial.updateFromConfig(materialConfig); } return pipeline; }
public Material getByFingerPrint(String fingerPrint) { for (Material material : this) { if (material.getPipelineUniqueFingerprint().equals(fingerPrint)) { return material; } } return null; }
public MaterialInstance findOrCreateFrom(Material material) { String cacheKey = materialKey(material); synchronized (cacheKey) { MaterialInstance materialInstance = findMaterialInstance(material); if (materialInstance == null) { LOGGER.debug("Material instance for material '{}' not found in the database, creating a new instance now.", material); materialInstance = material.createMaterialInstance(); saveOrUpdate(materialInstance); } return materialInstance; } }