Skip to content

Commit

Permalink
#1133 added configrepo material type to configrepo extension (#2432)
Browse files Browse the repository at this point in the history
  • Loading branch information
tomzo authored and zabil committed Aug 30, 2016
1 parent f9a96c3 commit aa488f6
Show file tree
Hide file tree
Showing 10 changed files with 247 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ public String getTruncatedDisplayName() {

protected abstract void appendPipelineUniqueCriteria(Map<String, Object> basicCriteria);

@Override
public void setName(final CaseInsensitiveString name) {
this.name = name;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public interface MaterialConfig extends Serializable, Validatable {

CaseInsensitiveString getName();

void setName(CaseInsensitiveString name);

Filter filter();

boolean isInvertFilter();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
package com.thoughtworks.go.config;

import com.thoughtworks.go.domain.config.Configuration;
import com.thoughtworks.go.domain.materials.MaterialConfig;

public interface PartialConfigLoadContext {
Configuration configuration();
MaterialConfig configMaterial();
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ private Class<?> classForName(String typeName) {
return CRP4Material.class;
if(typeName.equals(CRTfsMaterial.TYPE_NAME))
return CRTfsMaterial.class;
if(typeName.equals(CRConfigMaterial.TYPE_NAME))
return CRConfigMaterial.class;
else
throw new JsonParseException(
String.format("Invalid or unknown material type '%s'",typeName));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.thoughtworks.go.plugin.access.configrepo.contract.material;

import com.thoughtworks.go.plugin.access.configrepo.ErrorCollection;

public class CRConfigMaterial extends CRMaterial {
public static final String TYPE_NAME = "configrepo";

private String destination;

public CRConfigMaterial() {
type = TYPE_NAME;
}
public CRConfigMaterial(String name, String destination) {
super(TYPE_NAME,name);
this.destination = destination;
}


@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}

CRConfigMaterial that = (CRConfigMaterial)o;
if(that == null)
return false;

if(!super.equals(that))
return false;

if (destination != null ? !destination.equals(that.destination) : that.destination != null) {
return false;
}

return true;
}

@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (destination != null ? destination.hashCode() : 0);
return result;
}

@Override
public String typeName() {
return TYPE_NAME;
}

@Override
public void getErrors(ErrorCollection errors, String parentLocation) {
// no errors possible
}

@Override
public String getLocation(String parent) {
String myLocation = getLocation() == null ? parent : getLocation();
String name = getName() == null ? "" : getName();
return String.format("%s; Config material %s",myLocation,name);
}

public String getDestination() {
return destination;
}

public void setDestination(String destination) {
this.destination = destination;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.thoughtworks.go.plugin.access.configrepo.contract.material;

import com.google.gson.JsonObject;
import com.thoughtworks.go.plugin.access.configrepo.contract.CRBaseTest;
import org.junit.Test;

import java.util.Map;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

public class CRConfigMaterialTest extends CRBaseTest<CRConfigMaterial> {
private final CRConfigMaterial named;
private final CRConfigMaterial namedDest;

public CRConfigMaterialTest() {
named = new CRConfigMaterial("primary", null);
namedDest = new CRConfigMaterial("primary", "folder");
}

@Override
public void addGoodExamples(Map<String, CRConfigMaterial> examples) {
examples.put("namedExample", named);
examples.put("namedDest", namedDest);
}

@Override
public void addBadExamples(Map<String, CRConfigMaterial> examples) {
}

@Test
public void shouldAppendTypeFieldWhenSerializingMaterials()
{
CRMaterial value = named;
JsonObject jsonObject = (JsonObject)gson.toJsonTree(value);
assertThat(jsonObject.get("type").getAsString(), is(CRConfigMaterial.TYPE_NAME));
}

@Test
public void shouldHandlePolymorphismWhenDeserializing()
{
CRMaterial value = named;
String json = gson.toJson(value);

CRConfigMaterial deserializedValue = (CRConfigMaterial)gson.fromJson(json,CRMaterial.class);
assertThat(String.format("Deserialized value should equal to value before serialization"),
deserializedValue,is(value));
}

}
40 changes: 33 additions & 7 deletions server/src/com/thoughtworks/go/config/ConfigConverter.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.thoughtworks.go.config;

import com.rits.cloning.Cloner;
import com.thoughtworks.go.config.materials.*;
import com.thoughtworks.go.config.materials.dependency.DependencyMaterialConfig;
import com.thoughtworks.go.config.materials.git.GitMaterialConfig;
Expand Down Expand Up @@ -27,31 +28,35 @@
import com.thoughtworks.go.util.command.HgUrlArgument;
import com.thoughtworks.go.util.command.UrlArgument;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;

/**
* Helper to transform config repo classes to config-api classes
*/
public class ConfigConverter {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigConverter.class);

private final GoCipher cipher;
private final CachedGoConfig cachedGoConfig;
private Cloner cloner = new Cloner();

public ConfigConverter(GoCipher goCipher, CachedGoConfig cachedGoConfig) {
this.cipher = goCipher;
this.cachedGoConfig = cachedGoConfig;
}

public PartialConfig toPartialConfig(CRParseResult crPartialConfig) {
public PartialConfig toPartialConfig(CRParseResult crPartialConfig, PartialConfigLoadContext context) {
PartialConfig partialConfig = new PartialConfig();
for (CREnvironment crEnvironment : crPartialConfig.getEnvironments()) {
EnvironmentConfig environment = toEnvironmentConfig(crEnvironment);
partialConfig.getEnvironments().add(environment);
}
Map<String, List<CRPipeline>> pipesByGroup = groupPipelinesByGroupName(crPartialConfig.getPipelines());
for (Map.Entry<String, List<CRPipeline>> crPipelineGroup : pipesByGroup.entrySet()) {
BasicPipelineConfigs pipelineConfigs = toBasicPipelineConfigs(crPipelineGroup);
BasicPipelineConfigs pipelineConfigs = toBasicPipelineConfigs(crPipelineGroup, context);
partialConfig.getGroups().add(pipelineConfigs);
}
return partialConfig;
Expand All @@ -69,12 +74,12 @@ public Map<String, List<CRPipeline>> groupPipelinesByGroupName(Collection<CRPipe
return map;
}

public BasicPipelineConfigs toBasicPipelineConfigs(Map.Entry<String, List<CRPipeline>> crPipelineGroup) {
public BasicPipelineConfigs toBasicPipelineConfigs(Map.Entry<String, List<CRPipeline>> crPipelineGroup, PartialConfigLoadContext context) {
String name = crPipelineGroup.getKey();
BasicPipelineConfigs pipelineConfigs = new BasicPipelineConfigs();
pipelineConfigs.setGroup(name);
for (CRPipeline crPipeline : crPipelineGroup.getValue()) {
pipelineConfigs.add(toPipelineConfig(crPipeline));
pipelineConfigs.add(toPipelineConfig(crPipeline,context));
}
return pipelineConfigs;
}
Expand Down Expand Up @@ -241,7 +246,7 @@ private void setCommonMaterialMembers(AbstractMaterialConfig materialConfig, CRM
materialConfig.setName(toMaterialName(crMaterial.getName()));
}

public MaterialConfig toMaterialConfig(CRMaterial crMaterial) {
public MaterialConfig toMaterialConfig(CRMaterial crMaterial,PartialConfigLoadContext context) {
if (crMaterial == null)
throw new ConfigConvertionException("material cannot be null");

Expand All @@ -256,11 +261,32 @@ else if (crMaterial instanceof CRScmMaterial) {
} else if (crMaterial instanceof CRPackageMaterial) {
CRPackageMaterial crPackageMaterial = (CRPackageMaterial) crMaterial;
return toPackageMaterial(crPackageMaterial);
} else if(crMaterial instanceof CRConfigMaterial) {
CRConfigMaterial crConfigMaterial = (CRConfigMaterial)crMaterial;
MaterialConfig repoMaterial = cloner.deepClone(context.configMaterial());
if(StringUtils.isNotEmpty(crConfigMaterial.getName()))
repoMaterial.setName(new CaseInsensitiveString(crConfigMaterial.getName()));
if(StringUtils.isNotEmpty(crConfigMaterial.getDestination()))
setDestination(repoMaterial,crConfigMaterial.getDestination());
return repoMaterial;
} else
throw new ConfigConvertionException(
String.format("unknown material type '%s'", crMaterial));
}

private void setDestination(MaterialConfig repoMaterial, String destination) {
if(repoMaterial instanceof ScmMaterialConfig)
{
((ScmMaterialConfig)repoMaterial).setFolder(destination);
}
else if(repoMaterial instanceof PluggableSCMMaterialConfig)
{
((PluggableSCMMaterialConfig)repoMaterial).setFolder(destination);
}
else
LOGGER.warn("Unknown material type " + repoMaterial.getTypeForDisplay());
}

public PackageMaterialConfig toPackageMaterial(CRPackageMaterial crPackageMaterial) {
PackageDefinition packageDefinition = getPackageDefinition(crPackageMaterial.getPackageId());
return new PackageMaterialConfig(toMaterialName(crPackageMaterial.getName()), crPackageMaterial.getPackageId(), packageDefinition);
Expand Down Expand Up @@ -489,10 +515,10 @@ private JobConfigs toJobConfigs(Collection<CRJob> jobs) {
return jobConfigs;
}

public PipelineConfig toPipelineConfig(CRPipeline crPipeline) {
public PipelineConfig toPipelineConfig(CRPipeline crPipeline,PartialConfigLoadContext context) {
MaterialConfigs materialConfigs = new MaterialConfigs();
for (CRMaterial crMaterial : crPipeline.getMaterials()) {
materialConfigs.add(toMaterialConfig(crMaterial));
materialConfigs.add(toMaterialConfig(crMaterial,context));
}

PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString(crPipeline.getName()), materialConfigs);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public ConfigRepoPlugin(ConfigConverter configConverter, ConfigRepoExtension crE
public PartialConfig load(File configRepoCheckoutDirectory, PartialConfigLoadContext context) {
Collection<CRConfigurationProperty> cRconfigurations = getCrConfigurations(context.configuration());
CRParseResult crPartialConfig = parseDirectory(configRepoCheckoutDirectory, cRconfigurations);
return configConverter.toPartialConfig(crPartialConfig);
return configConverter.toPartialConfig(crPartialConfig, context);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,5 +250,10 @@ public LoadContext(ConfigRepoConfig repoConfig) {
public Configuration configuration() {
return repoConfig.getConfiguration();
}

@Override
public MaterialConfig configMaterial() {
return this.repoConfig.getMaterialConfig();
}
}
}
Loading

0 comments on commit aa488f6

Please sign in to comment.