/*******************************************************************************
* Copyright (c) 2016-2017 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package com.openshift.internal.restclient.model.build;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.commons.lang.StringUtils;
import org.jboss.dmr.ModelNode;
import com.openshift.internal.restclient.model.BuildConfig;
import com.openshift.restclient.IClient;
import com.openshift.restclient.ResourceKind;
import com.openshift.restclient.images.DockerImageURI;
import com.openshift.restclient.model.IBuildConfig;
import com.openshift.restclient.model.IEnvironmentVariable;
import com.openshift.restclient.model.IObjectReference;
import com.openshift.restclient.model.build.BuildTriggerType;
import com.openshift.restclient.model.build.IBuildConfigBuilder;
/**
* Impl of a builder to create buildconfigs
* @author jeff.cantrill
*
*/
public class BuildConfigBuilder implements IBuildConfigBuilder {
private SourceStrategyBuilder sourceStrategyBuilder;
private GitSourceBuilder gitSourceBuilder;
private JenkinsPipelineStrategyBuilder jenkinsPipelineStrategyBuilder;
private String imageStreamTagOutput;
private boolean buildOnConfigChange;
private boolean buildOnImageChange;
private boolean buildOnSourceChange;
private final IClient client;
private String name;
private String namespace;
private Map<String, String> labels;
public BuildConfigBuilder(IClient client) {
this.client = client;
}
@Override
public boolean isSupported() {
return true;
}
@Override
public String getName() {
return BuildConfigBuilder.class.getSimpleName();
}
@Override
public IBuildConfigBuilder named(String name) {
this.name = name;
return this;
}
@Override
public IBuildConfigBuilder inNamespace(String namespace) {
this.namespace = namespace;
return this;
}
@Override
public IBuildConfigBuilder withLabels(Map<String, String> labels) {
this.labels = labels;
return this;
}
@Override
public IBuildConfig build() {
BuildConfig bc = client.getResourceFactory().stub(ResourceKind.BUILD_CONFIG, this.name, this.namespace);
if(sourceStrategyBuilder != null) {
bc.setBuildStrategy(sourceStrategyBuilder.build(bc.getPropertyKeys()));
} else if (jenkinsPipelineStrategyBuilder != null) {
bc.setBuildStrategy(jenkinsPipelineStrategyBuilder.build(bc.getPropertyKeys()));
}
if(gitSourceBuilder != null) {
bc.setBuildSource(gitSourceBuilder.build());
}
if (labels != null && !labels.isEmpty()) {
for (Map.Entry<String, String> label : labels.entrySet()) {
bc.addLabel(label.getKey(), label.getValue());
}
}
DockerImageURI uri = new DockerImageURI(imageStreamTagOutput);
IObjectReference outRef = bc.getBuildOutputReference();
outRef.setKind(ResourceKind.IMAGE_STREAM_TAG);
outRef.setName(uri.getNameAndTag());
if(StringUtils.isNotBlank(uri.getUserName())) {
outRef.setNamespace(uri.getUserName());
}
bc.addBuildTrigger(new WebhookTrigger(BuildTriggerType.GENERIC, UUID.randomUUID().toString(), null));
if(buildOnImageChange) {
bc.addBuildTrigger(new ImageChangeTrigger(BuildTriggerType.IMAGE_CHANGE, null, null, null));
}
if(buildOnConfigChange) {
bc.addBuildTrigger(new ImageChangeTrigger(BuildTriggerType.CONFIG_CHANGE,null, null, null));
}
if(buildOnSourceChange) {
bc.addBuildTrigger(new WebhookTrigger(BuildTriggerType.GITHUB, UUID.randomUUID().toString(), null));
}
return bc;
}
@Override
public IBuildConfigBuilder buildOnSourceChange(boolean onSourceChange) {
this.buildOnSourceChange = onSourceChange;
return this;
}
@Override
public IBuildConfigBuilder buildOnImageChange(boolean onImageChange) {
this.buildOnImageChange = onImageChange;
return this;
}
@Override
public IBuildConfigBuilder buildOnConfigChange(boolean onConfigChange) {
this.buildOnConfigChange = onConfigChange;
return this;
}
@Override
public IBuildConfigBuilder toImageStreamTag(String tag) {
imageStreamTagOutput = tag;
return this;
}
@Override
public ISourceStrategyBuilder usingSourceStrategy() {
sourceStrategyBuilder = new SourceStrategyBuilder(this);
return sourceStrategyBuilder;
}
@Override
public IGitSourceBuilder fromGitSource() {
gitSourceBuilder = new GitSourceBuilder(this);
return gitSourceBuilder;
}
@Override
public IJenkinsPipelineStrategyBuilder usingJenkinsPipelineStrategy() {
jenkinsPipelineStrategyBuilder = new JenkinsPipelineStrategyBuilder(this);
return jenkinsPipelineStrategyBuilder;
}
class GitSourceBuilder implements IGitSourceBuilder {
private IBuildConfigBuilder builder;
private String url;
private String ref;
private String contextDir;
GitSourceBuilder(IBuildConfigBuilder builder){
this.builder = builder;
}
private GitBuildSource build() {
return new GitBuildSource(url, ref, contextDir);
}
@Override
public IBuildConfigBuilder end() {
return builder;
}
@Override
public IGitSourceBuilder fromGitUrl(String url) {
this.url = url;
return this;
}
@Override
public IGitSourceBuilder usingGitReference(String ref) {
this.ref = ref;
return this;
}
@Override
public IGitSourceBuilder inContextDir(String contextDir) {
this.contextDir = contextDir;
return this;
}
}
class SourceStrategyBuilder implements ISourceStrategyBuilder{
private IBuildConfigBuilder builder;
private List<IEnvironmentVariable> envVars;
private String namespace;
private String tag;
private String fromKind;
SourceStrategyBuilder(IBuildConfigBuilder builder){
this.builder = builder;
}
public SourceBuildStrategy build(Map<String, String[]> overrides) {
SourceBuildStrategy strategy = new SourceBuildStrategy(new ModelNode(), overrides);
strategy.setEnvVars(envVars);
strategy.setFromNamespace(namespace);
strategy.setImage(new DockerImageURI(tag));
strategy.setFromKind(fromKind);
return strategy;
}
@Override
public IBuildConfigBuilder end() {
return builder;
}
@Override
public ISourceStrategyBuilder fromImageStreamTag(String tag) {
this.tag = tag;
this.fromKind = ResourceKind.IMAGE_STREAM_TAG;
return this;
}
@Override
public ISourceStrategyBuilder inNamespace(String namespace) {
this.namespace = namespace;
return this;
}
@Override
public ISourceStrategyBuilder withEnvVars(List<IEnvironmentVariable> envVars) {
this.envVars = envVars;
return this;
}
@Override
public ISourceStrategyBuilder fromDockerImage(String tag) {
this.tag = tag;
this.fromKind = "DockerImage";
return this;
}
}
class JenkinsPipelineStrategyBuilder implements IJenkinsPipelineStrategyBuilder {
private IBuildConfigBuilder builder;
private String jenkinsFilePath;
private String jenkinsFile;
JenkinsPipelineStrategyBuilder(IBuildConfigBuilder builder){
this.builder = builder;
}
@Override
public IJenkinsPipelineStrategyBuilder usingFile(String file) {
this.jenkinsFile = file;
return this;
}
@Override
public IJenkinsPipelineStrategyBuilder usingFilePath(String filePath) {
this.jenkinsFilePath = filePath;
return this;
}
private JenkinsPipelineStrategy build(Map<String, String[]> overrides) {
JenkinsPipelineStrategy strategy = new JenkinsPipelineStrategy(new ModelNode(), overrides);
strategy.setJenkinsfilePath(jenkinsFilePath);
strategy.setJenkinsfile(jenkinsFile);
return strategy;
}
@Override
public IBuildConfigBuilder end() {
return builder;
}
}
}