Java tutorial
/******************************************************************************* * Copyright (c) 2015 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. ******************************************************************************/ package com.openshift.internal.restclient.model; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.jboss.dmr.ModelNode; import com.openshift.internal.restclient.capability.CapabilityInitializer; import com.openshift.internal.restclient.model.build.CustomBuildStrategy; import com.openshift.internal.restclient.model.build.DockerBuildStrategy; import com.openshift.internal.restclient.model.build.GitBuildSource; import com.openshift.internal.restclient.model.build.ImageChangeTrigger; import com.openshift.internal.restclient.model.build.STIBuildStrategy; import com.openshift.internal.restclient.model.build.SourceBuildStrategy; import com.openshift.internal.restclient.model.build.WebhookTrigger; import com.openshift.restclient.IClient; import com.openshift.restclient.images.DockerImageURI; import com.openshift.restclient.model.IBuildConfig; import com.openshift.restclient.model.IObjectReference; import com.openshift.restclient.model.build.BuildSourceType; import com.openshift.restclient.model.build.BuildStrategyType; import com.openshift.restclient.model.build.BuildTriggerType; import com.openshift.restclient.model.build.IBuildSource; import com.openshift.restclient.model.build.IBuildStrategy; import com.openshift.restclient.model.build.IBuildTrigger; import com.openshift.restclient.model.build.ICustomBuildStrategy; import com.openshift.restclient.model.build.IDockerBuildStrategy; import com.openshift.restclient.model.build.IGitBuildSource; import com.openshift.restclient.model.build.IImageChangeTrigger; import com.openshift.restclient.model.build.ISTIBuildStrategy; import com.openshift.restclient.model.build.IWebhookTrigger; /** * @author Jeff Cantrill */ public class BuildConfig extends KubernetesResource implements IBuildConfig { private static final String BUILDCONFIG_SOURCE_CONTEXTDIR = "spec.source.contextDir"; private static final String BUILDCONFIG_SOURCE_TYPE = "spec.source.type"; private static final String BUILDCONFIG_SOURCE_URI = "spec.source.git.uri"; private static final String BUILDCONFIG_SOURCE_REF = "spec.source.git.ref"; public static final String BUILDCONFIG_TYPE = "spec.strategy.type"; private static final String BUILDCONFIG_CUSTOM_IMAGE = "spec.strategy.customStrategy.image"; private static final String BUILDCONFIG_CUSTOM_EXPOSEDOCKERSOCKET = "spec.strategy.customStrategy.exposeDockerSocket"; private static final String BUILDCONFIG_CUSTOM_ENV = "spec.strategy.customStrategy.env"; public static final String BUILDCONFIG_DOCKER_CONTEXTDIR = "spec.strategy.dockerStrategy.contextDir"; public static final String BUILDCONFIG_DOCKER_NOCACHE = "spec.strategy.dockerStrategy.noCache"; public static final String BUILDCONFIG_DOCKER_BASEIMAGE = "spec.strategy.dockerStrategy.baseImage"; private static final String BUILDCONFIG_OUTPUT_REPO = "spec.output.to.name"; private static final String BUILDCONFIG_STI_IMAGE = "spec.strategy.sourceStrategy.from.name"; private static final String BUILDCONFIG_STI_SCRIPTS = "spec.strategy.sourceStrategy.scripts"; private static final String BUILDCONFIG_STI_INCREMENTAL = "spec.strategy.sourceStrategy.incremental"; private static final String BUILDCONFIG_STI_ENV = "spec.strategy.sourceStrategy.env"; private static final String BUILDCONFIG_TRIGGERS = "spec.triggers"; private static final String BUILD_CONFIG_WEBHOOK_GITHUB_SECRET = "github.secret"; private static final String BUILD_CONFIG_WEBHOOK_GENERIC_SECRET = "generic.secret"; private static final String BUILD_CONFIG_IMAGECHANGE_IMAGE = "imageChange.image"; private static final String BUILD_CONFIG_IMAGECHANGE_NAME = "imageChange.from.name"; private static final String BUILD_CONFIG_IMAGECHANGE_TAG = "imageChange.tag"; public BuildConfig(ModelNode node, IClient client, Map<String, String[]> overrideProperties) { super(node, client, null); CapabilityInitializer.initializeCapabilities(getModifiableCapabilities(), this, client); } @Override public IObjectReference getBuildOutputReference() { ModelNode node = get("spec.output.to"); if (!node.isDefined()) return null; return new ObjectReference(node); } @Override public List<IBuildTrigger> getBuildTriggers() { List<IBuildTrigger> triggers = new ArrayList<IBuildTrigger>(); List<ModelNode> list = get(BUILDCONFIG_TRIGGERS).asList(); final String url = getClient() != null ? getClient().getResourceURI(this) : ""; for (ModelNode node : list) { String type = node.get("type").asString(); switch (type) { case BuildTriggerType.generic: case BuildTriggerType.GENERIC: triggers.add(new WebhookTrigger(BuildTriggerType.GENERIC, asString(node, BUILD_CONFIG_WEBHOOK_GENERIC_SECRET), url)); break; case BuildTriggerType.github: case BuildTriggerType.GITHUB: triggers.add(new WebhookTrigger(BuildTriggerType.GITHUB, asString(node, BUILD_CONFIG_WEBHOOK_GITHUB_SECRET), url)); break; case BuildTriggerType.imageChange: case BuildTriggerType.IMAGE_CHANGE: triggers.add(new ImageChangeTrigger(BuildTriggerType.IMAGE_CHANGE, asString(node, BUILD_CONFIG_IMAGECHANGE_IMAGE), asString(node, BUILD_CONFIG_IMAGECHANGE_NAME), asString(node, BUILD_CONFIG_IMAGECHANGE_TAG))); break; default: } } return triggers; } @Override public void addBuildTrigger(IBuildTrigger trigger) { ModelNode triggers = get(BUILDCONFIG_TRIGGERS); ModelNode triggerNode = triggers.add(); switch (trigger.getType()) { case BuildTriggerType.generic: case BuildTriggerType.GENERIC: if (!(trigger instanceof IWebhookTrigger)) { throw new IllegalArgumentException( "IBuildTrigger of type generic does not implement IWebhookTrigger"); } IWebhookTrigger generic = (IWebhookTrigger) trigger; triggerNode.get(getPath(BUILD_CONFIG_WEBHOOK_GENERIC_SECRET)).set(generic.getSecret()); break; case BuildTriggerType.github: case BuildTriggerType.GITHUB: if (!(trigger instanceof IWebhookTrigger)) { throw new IllegalArgumentException( "IBuildTrigger of type github does not implement IWebhookTrigger"); } IWebhookTrigger github = (IWebhookTrigger) trigger; triggerNode.get(getPath(BUILD_CONFIG_WEBHOOK_GITHUB_SECRET)).set(github.getSecret()); break; case BuildTriggerType.imageChange: case BuildTriggerType.IMAGE_CHANGE: if (!(trigger instanceof IImageChangeTrigger)) { throw new IllegalArgumentException( "IBuildTrigger of type imageChange does not implement IImageChangeTrigger"); } IImageChangeTrigger image = (IImageChangeTrigger) trigger; triggerNode.get(getPath(BUILD_CONFIG_IMAGECHANGE_IMAGE)).set(defaultIfNull(image.getImage())); triggerNode.get(getPath(BUILD_CONFIG_IMAGECHANGE_NAME)).set(defaultIfNull(image.getFrom())); triggerNode.get(getPath(BUILD_CONFIG_IMAGECHANGE_TAG)) .set(StringUtils.defaultIfBlank(image.getTag(), "")); break; } triggerNode.get("type").set(trigger.getType()); } private String defaultIfNull(DockerImageURI uri) { if (uri == null) return ""; return uri.toString(); } @Override public String getOutputRepositoryName() { return asString(BUILDCONFIG_OUTPUT_REPO); } public String getSourceURI() { return asString(BUILDCONFIG_SOURCE_URI); } @SuppressWarnings("unchecked") @Override public <T extends IBuildSource> T getBuildSource() { switch (asString(BUILDCONFIG_SOURCE_TYPE)) { case BuildSourceType.GIT: return (T) new GitBuildSource(asString(BUILDCONFIG_SOURCE_URI), asString(BUILDCONFIG_SOURCE_REF), asString(BUILDCONFIG_SOURCE_CONTEXTDIR)); default: } return null; } @Override public void setBuildSource(IBuildSource source) { switch (source.getType()) { case BuildSourceType.GIT: if (!(source instanceof IGitBuildSource)) { throw new IllegalArgumentException("IBuildSource of type Git does not implement IGitBuildSource"); } IGitBuildSource git = (IGitBuildSource) source; set(BUILDCONFIG_SOURCE_REF, git.getRef()); break; } set(BUILDCONFIG_SOURCE_URI, source.getURI()); set(BUILDCONFIG_SOURCE_TYPE, source.getType().toString()); set(BUILDCONFIG_SOURCE_CONTEXTDIR, source.getContextDir()); } @Override public void setBuildStrategy(IBuildStrategy strategy) { // Remove other strategies if already set? switch (strategy.getType()) { case BuildStrategyType.CUSTOM: if (!(strategy instanceof ICustomBuildStrategy)) { throw new IllegalArgumentException( "IBuildStrategy of type Custom does not implement ICustomBuildStrategy"); } ICustomBuildStrategy custom = (ICustomBuildStrategy) strategy; if (custom.getImage() != null) { set(BUILDCONFIG_CUSTOM_IMAGE, custom.getImage().toString()); } set(BUILDCONFIG_CUSTOM_EXPOSEDOCKERSOCKET, custom.exposeDockerSocket()); if (custom.getEnvironmentVariables() != null) { setEnvMap(BUILDCONFIG_CUSTOM_ENV, custom.getEnvironmentVariables()); } break; case BuildStrategyType.STI: case BuildStrategyType.SOURCE: if (!(strategy instanceof ISTIBuildStrategy)) { throw new IllegalArgumentException( "IBuildStrategy of type Custom does not implement ISTIBuildStrategy"); } ISTIBuildStrategy sti = (ISTIBuildStrategy) strategy; if (sti.getImage() != null) { set(BUILDCONFIG_STI_IMAGE, sti.getImage().toString()); } if (sti.getScriptsLocation() != null) { set(BUILDCONFIG_STI_SCRIPTS, sti.getScriptsLocation()); } set(BUILDCONFIG_STI_INCREMENTAL, sti.incremental()); if (sti.getEnvironmentVariables() != null) { setEnvMap(BUILDCONFIG_STI_ENV, sti.getEnvironmentVariables()); } break; case BuildStrategyType.DOCKER: if (!(strategy instanceof IDockerBuildStrategy)) { throw new IllegalArgumentException( "IBuildStrategy of type Custom does not implement IDockerBuildStrategy"); } IDockerBuildStrategy docker = (IDockerBuildStrategy) strategy; if (docker.getBaseImage() != null) { set(BUILDCONFIG_DOCKER_BASEIMAGE, docker.getBaseImage().toString()); } if (docker.getContextDir() != null) { set(BUILDCONFIG_DOCKER_CONTEXTDIR, docker.getContextDir()); } set(BUILDCONFIG_DOCKER_NOCACHE, docker.isNoCache()); break; } set(BUILDCONFIG_TYPE, strategy.getType()); } public void setOutput(DockerImageURI imageUri) { //FIXME // ModelNode output = getNode().get(new String []{"parameters","output"}); // output.get("imageTag").set(imageUri.getUriWithoutHost()); // output.get("registry").set(imageUri.getRepositoryHost()); } @SuppressWarnings("unchecked") @Override public <T extends IBuildStrategy> T getBuildStrategy() { switch (asString(BUILDCONFIG_TYPE)) { case BuildStrategyType.CUSTOM: return (T) new CustomBuildStrategy(asString(BUILDCONFIG_CUSTOM_IMAGE), asBoolean(BUILDCONFIG_CUSTOM_EXPOSEDOCKERSOCKET), getEnvMap(BUILDCONFIG_CUSTOM_ENV)); case BuildStrategyType.STI: case BuildStrategyType.SOURCE: return (T) new SourceBuildStrategy(asString(BUILDCONFIG_STI_IMAGE), asString(BUILDCONFIG_STI_SCRIPTS), asBoolean(BUILDCONFIG_STI_INCREMENTAL), getEnvMap(BUILDCONFIG_STI_ENV)); case BuildStrategyType.DOCKER: return (T) new DockerBuildStrategy(asString(BUILDCONFIG_DOCKER_CONTEXTDIR), asBoolean(BUILDCONFIG_DOCKER_NOCACHE), asString(BUILDCONFIG_DOCKER_BASEIMAGE)); default: } return null; } }