Example #1
0
 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."));
  }