private ScmMaterialConfig toScmMaterialConfig(CRScmMaterial crScmMaterial) { String materialName = crScmMaterial.getName(); if (crScmMaterial instanceof CRGitMaterial) { CRGitMaterial git = (CRGitMaterial) crScmMaterial; Filter filter = toFilter(crScmMaterial); String gitBranch = git.getBranch(); if (StringUtils.isBlank(gitBranch)) gitBranch = GitMaterialConfig.DEFAULT_BRANCH; GitMaterialConfig gitConfig = new GitMaterialConfig(git.getUrl(), gitBranch, git.shallowClone()); setCommonMaterialMembers(gitConfig, crScmMaterial); setCommonScmMaterialMembers(gitConfig, git); return gitConfig; } else if (crScmMaterial instanceof CRHgMaterial) { CRHgMaterial hg = (CRHgMaterial) crScmMaterial; return new HgMaterialConfig( new HgUrlArgument(hg.getUrl()), hg.isAutoUpdate(), toFilter(crScmMaterial), false, hg.getDirectory(), toMaterialName(materialName)); } else if (crScmMaterial instanceof CRP4Material) { CRP4Material crp4Material = (CRP4Material) crScmMaterial; P4MaterialConfig p4MaterialConfig = new P4MaterialConfig(crp4Material.getServerAndPort(), crp4Material.getView(), cipher); if (crp4Material.getEncryptedPassword() != null) { p4MaterialConfig.setEncryptedPassword(crp4Material.getEncryptedPassword()); } else { p4MaterialConfig.setPassword(crp4Material.getPassword()); } p4MaterialConfig.setUserName(crp4Material.getUserName()); p4MaterialConfig.setUseTickets(crp4Material.getUseTickets()); setCommonMaterialMembers(p4MaterialConfig, crScmMaterial); setCommonScmMaterialMembers(p4MaterialConfig, crp4Material); return p4MaterialConfig; } else if (crScmMaterial instanceof CRSvnMaterial) { CRSvnMaterial crSvnMaterial = (CRSvnMaterial) crScmMaterial; SvnMaterialConfig svnMaterialConfig = new SvnMaterialConfig( crSvnMaterial.getUrl(), crSvnMaterial.getUserName(), crSvnMaterial.isCheckExternals(), cipher); if (crSvnMaterial.getEncryptedPassword() != null) { svnMaterialConfig.setEncryptedPassword(crSvnMaterial.getEncryptedPassword()); } else { svnMaterialConfig.setPassword(crSvnMaterial.getPassword()); } setCommonMaterialMembers(svnMaterialConfig, crScmMaterial); setCommonScmMaterialMembers(svnMaterialConfig, crSvnMaterial); return svnMaterialConfig; } else if (crScmMaterial instanceof CRTfsMaterial) { CRTfsMaterial crTfsMaterial = (CRTfsMaterial) crScmMaterial; TfsMaterialConfig tfsMaterialConfig = new TfsMaterialConfig( cipher, new UrlArgument(crTfsMaterial.getUrl()), crTfsMaterial.getUserName(), crTfsMaterial.getDomain(), crTfsMaterial.getProjectPath()); if (crTfsMaterial.getEncryptedPassword() != null) { tfsMaterialConfig.setEncryptedPassword(crTfsMaterial.getEncryptedPassword()); } else { tfsMaterialConfig.setPassword(crTfsMaterial.getPassword()); } setCommonMaterialMembers(tfsMaterialConfig, crTfsMaterial); setCommonScmMaterialMembers(tfsMaterialConfig, crTfsMaterial); return tfsMaterialConfig; } else throw new ConfigConvertionException( String.format("unknown scm material type '%s'", crScmMaterial)); }
@Test public void shouldSetAServerHealthMessageWhenMaterialForPipelineWithBuildCauseIsNotFound() throws IllegalArtifactLocationException, IOException { PipelineConfig pipelineConfig = PipelineConfigMother.pipelineConfig( "last", new StageConfig( new CaseInsensitiveString("stage"), new JobConfigs(new JobConfig("job-one")))); pipelineConfig.materialConfigs().clear(); SvnMaterialConfig onDirOne = MaterialConfigsMother.svnMaterialConfig( "google.com", "dirOne", "loser", "boozer", false, "**/*.html"); final P4MaterialConfig onDirTwo = MaterialConfigsMother.p4MaterialConfig( "host:987654321", "zoozer", "secret", "through-the-window", true); onDirTwo.setConfigAttributes(Collections.singletonMap(ScmMaterialConfig.FOLDER, "dirTwo")); pipelineConfig.addMaterialConfig(onDirOne); pipelineConfig.addMaterialConfig(onDirTwo); configHelper.addPipeline(pipelineConfig); Pipeline building = PipelineMother.building(pipelineConfig); final Pipeline pipeline = dbHelper.savePipelineWithMaterials(building); CruiseConfig cruiseConfig = configHelper.currentConfig(); PipelineConfig cfg = cruiseConfig.pipelineConfigByName(new CaseInsensitiveString("last")); cfg.removeMaterialConfig(cfg.materialConfigs().get(1)); configHelper.writeConfigFile(cruiseConfig); assertThat( serverHealthService.filterByScope(HealthStateScope.forPipeline("last")).size(), is(0)); final long jobId = pipeline.getStages().get(0).getJobInstances().get(0).getId(); Date currentTime = new Date(System.currentTimeMillis() - 1); Pipeline loadedPipeline = (Pipeline) transactionTemplate.execute( new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { Pipeline loadedPipeline = null; try { loadedPipeline = loader.pipelineWithPasswordAwareBuildCauseByBuildId(jobId); fail( "should not have loaded pipeline with build-cause as one of the necessary materials was not found"); } catch (Exception e) { assertThat(e, is(instanceOf(StaleMaterialsOnBuildCause.class))); assertThat( e.getMessage(), is( "Cannot load job 'last/" + pipeline.getCounter() + "/stage/1/job-one' because material " + onDirTwo + " was not found in config.")); } return loadedPipeline; } }); assertThat(loadedPipeline, is(nullValue())); JobInstance reloadedJobInstance = jobInstanceService.buildById(jobId); assertThat(reloadedJobInstance.getState(), is(JobState.Completed)); assertThat(reloadedJobInstance.getResult(), is(JobResult.Failed)); assertThat( serverHealthService .filterByScope(HealthStateScope.forJob("last", "stage", "job-one")) .size(), is(1)); ServerHealthState error = serverHealthService .filterByScope(HealthStateScope.forJob("last", "stage", "job-one")) .get(0); assertThat( error, is( ServerHealthState.error( "Cannot load job 'last/" + pipeline.getCounter() + "/stage/1/job-one' because material " + onDirTwo + " was not found in config.", "Job for pipeline 'last/" + pipeline.getCounter() + "/stage/1/job-one' has been failed as one or more material configurations were either changed or removed.", HealthStateType.general(HealthStateScope.forJob("last", "stage", "job-one"))))); DateTime expiryTime = (DateTime) ReflectionUtil.getField(error, "expiryTime"); assertThat(expiryTime.toDate().after(currentTime), is(true)); assertThat( expiryTime.toDate().before(new Date(System.currentTimeMillis() + 5 * 60 * 1000 + 1)), is(true)); String logText = FileUtil.readToEnd(consoleService.findConsoleArtifact(reloadedJobInstance.getIdentifier())); assertThat( logText, containsString( "Cannot load job 'last/" + pipeline.getCounter() + "/stage/1/job-one' because material " + onDirTwo + " was not found in config.")); assertThat( logText, containsString( "Job for pipeline 'last/" + pipeline.getCounter() + "/stage/1/job-one' has been failed as one or more material configurations were either changed or removed.")); }