/* * Copyright 2016 ThoughtWorks, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.thoughtworks.go.config; import com.thoughtworks.go.config.elastic.ElasticConfig; import com.thoughtworks.go.config.preprocessor.SkipParameterResolution; import com.thoughtworks.go.domain.ConfigErrors; import com.thoughtworks.go.domain.ServerSiteUrlConfig; import com.thoughtworks.go.security.GoCipher; import com.thoughtworks.go.util.StringUtil; import org.apache.commons.lang.StringUtils; import javax.annotation.PostConstruct; import java.util.UUID; @ConfigTag("server") public class ServerConfig implements Validatable { public static final String SERVER_BACKUPS = "serverBackups"; @ConfigAttribute(value = "artifactsdir", alwaysWrite = true) private String artifactsDir = "artifacts"; @ConfigAttribute(value = "siteUrl", optional = true) private ServerSiteUrlConfig siteUrl = new ServerSiteUrlConfig(); @ConfigAttribute(value = "secureSiteUrl", optional = true) private ServerSiteUrlConfig secureSiteUrl = new ServerSiteUrlConfig(); @ConfigAttribute(value = "purgeStart", optional = true, allowNull = true) private Double purgeStart; @ConfigAttribute(value = "purgeUpto", optional = true, allowNull = true) private Double purgeUpto; @ConfigAttribute(value = "jobTimeout", optional = true) private String jobTimeout = "0"; @ConfigAttribute(value="agentAutoRegisterKey", optional = true, allowNull = true) private String agentAutoRegisterKey; @ConfigAttribute(value="commandRepositoryLocation", alwaysWrite = true) private String commandRepositoryLocation = "default"; @ConfigSubtag private ElasticConfig elasticConfig = new ElasticConfig(); @SkipParameterResolution @ConfigAttribute(value = "serverId", optional = true, allowNull = true) private String serverId; @ConfigSubtag private SecurityConfig securityConfig = new SecurityConfig(); @ConfigSubtag private MailHost mailHost = new MailHost(new GoCipher()); private ConfigErrors errors = new ConfigErrors(); public static final String JOB_TIMEOUT = "JOB_TIMEOUT"; public static final String NEVER_TIMEOUT = "neverTimeout"; public static final String OVERRIDE_TIMEOUT = "overrideTimeout"; public static final String PURGE_START = "purgeStart"; public ServerConfig() { } public ServerConfig(SecurityConfig securityConfig, MailHost mailHost, ServerSiteUrlConfig serverSiteUrl, ServerSiteUrlConfig secureSiteUrl) { this.securityConfig = securityConfig; this.mailHost = mailHost; this.siteUrl = serverSiteUrl; this.secureSiteUrl = secureSiteUrl; } @PostConstruct public void ensureServerIdExists() { if (serverId == null) { serverId = UUID.randomUUID().toString(); } } @PostConstruct public void ensureAgentAutoregisterKeyExists() { if (StringUtils.isBlank(agentAutoRegisterKey)) { agentAutoRegisterKey = UUID.randomUUID().toString(); } } public ServerConfig(SecurityConfig securityConfig, MailHost mailHost) { this(securityConfig, mailHost, new ServerSiteUrlConfig(), new ServerSiteUrlConfig()); } public ServerConfig(String artifactsDir, SecurityConfig securityConfig) { this.artifactsDir = artifactsDir; this.securityConfig = securityConfig; } public ServerConfig(String artifactsDir, SecurityConfig securityConfig, Double purgeStart, Double purgeUpto) { this(artifactsDir, securityConfig); this.purgeStart = purgeStart; this.purgeUpto = purgeUpto; } public ServerConfig(String artifacts, SecurityConfig securityConfig, double purgeStart, double purgeUpto, String jobTimeout) { this(artifacts, securityConfig, purgeStart, purgeUpto); this.jobTimeout = jobTimeout; } public ServerConfig(String artifacts, SecurityConfig securityConfig, int purgeStart, int purgeUpto, String jobTimeout, String agentAutoRegisterKey) { this(artifacts, securityConfig, purgeStart, purgeUpto, jobTimeout); this.agentAutoRegisterKey = agentAutoRegisterKey; } public ServerConfig(ElasticConfig elasticConfig) { this.elasticConfig = elasticConfig; } public String artifactsDir() { return artifactsDir; } public boolean isSecurityEnabled() { return securityConfig.isSecurityEnabled(); } public void useSecurity(SecurityConfig securityConfig) { this.securityConfig = securityConfig; } public SecurityConfig security() { return this.securityConfig; } public boolean anonymousAccess() { return securityConfig.anonymousAccess(); } public MailHost mailHost() { return mailHost; } public void updateMailHost(MailHost mailHost) { this.mailHost.updateWithNew(mailHost); } public void updateArtifactRoot(String path) { this.artifactsDir = path; } public ElasticConfig getElasticConfig() { return elasticConfig; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof ServerConfig)) { return false; } ServerConfig that = (ServerConfig) o; if (artifactsDir != null ? !artifactsDir.equals(that.artifactsDir) : that.artifactsDir != null) { return false; } if (jobTimeout != null ? !jobTimeout.equals(that.jobTimeout) : that.jobTimeout != null) { return false; } if (serverId != null ? !serverId.equals(that.serverId) : that.serverId != null) { return false; } if (agentAutoRegisterKey != null ? !agentAutoRegisterKey.equals(that.agentAutoRegisterKey) : that.agentAutoRegisterKey != null) { return false; } if (mailHost != null ? !mailHost.equals(that.mailHost) : that.mailHost != null) { return false; } if (purgeStart != null ? !purgeStart.equals(that.purgeStart) : that.purgeStart != null) { return false; } if (purgeUpto != null ? !purgeUpto.equals(that.purgeUpto) : that.purgeUpto != null) { return false; } if (secureSiteUrl != null ? !secureSiteUrl.equals(that.secureSiteUrl) : that.secureSiteUrl != null) { return false; } if (securityConfig != null ? !securityConfig.equals(that.securityConfig) : that.securityConfig != null) { return false; } if (siteUrl != null ? !siteUrl.equals(that.siteUrl) : that.siteUrl != null) { return false; } return true; } @Override public int hashCode() { int result = artifactsDir != null ? artifactsDir.hashCode() : 0; result = 31 * result + (agentAutoRegisterKey != null ? agentAutoRegisterKey.hashCode() : 0); result = 31 * result + (siteUrl != null ? siteUrl.hashCode() : 0); result = 31 * result + (secureSiteUrl != null ? secureSiteUrl.hashCode() : 0); result = 31 * result + (purgeStart != null ? purgeStart.hashCode() : 0); result = 31 * result + (purgeUpto != null ? purgeUpto.hashCode() : 0); result = 31 * result + (jobTimeout != null ? jobTimeout.hashCode() : 0); result = 31 * result + (securityConfig != null ? securityConfig.hashCode() : 0); result = 31 * result + (mailHost != null ? mailHost.hashCode() : 0); return result; } /** * only used for test * * @deprecated */ public void setArtifactsDir(String artifactsDir) { this.artifactsDir = artifactsDir; } /** * only used for test * * @deprecated */ public void setMailHost(MailHost mailHost) { this.mailHost = mailHost; } /** * only used for test * * @deprecated */ public void setSiteUrl(String siteUrl) { this.siteUrl = StringUtil.isBlank(siteUrl) ? new ServerSiteUrlConfig() : new ServerSiteUrlConfig(siteUrl); } /** * only used for test * * @deprecated */ public void setSecureSiteUrl(String secureSiteUrl) { this.secureSiteUrl = StringUtil.isBlank(secureSiteUrl) ? new ServerSiteUrlConfig() : new ServerSiteUrlConfig(secureSiteUrl); } public void validate(ValidationContext validationContext) { if (!(purgeStart == null && purgeUpto == null)) { if (purgeUpto != null && (purgeStart == null || purgeStart == 0)) { errors().add(PURGE_START, "Error in artifact cleanup values. The trigger value is has to be specified when a goal is set"); } else if (purgeStart > purgeUpto) { errors().add(PURGE_START, String.format("Error in artifact cleanup values. The trigger value (%sGB) should be less than the goal (%sGB)", purgeStart, purgeUpto)); } } try { if (Double.parseDouble(jobTimeout) < 0) { errors().add(JOB_TIMEOUT, "Timeout cannot be a negative number as it represents number of minutes"); } } catch (NumberFormatException e) { errors().add(JOB_TIMEOUT, "Timeout should be a valid number as it represents number of minutes"); } } public ConfigErrors errors() { return errors; } public void addError(String fieldName, String message) { errors.add(fieldName, message); } public ServerSiteUrlConfig getSecureSiteUrl() { return secureSiteUrl; } public ServerSiteUrlConfig getSiteUrl() { return siteUrl; } public ServerSiteUrlConfig getSiteUrlPreferablySecured() { ServerSiteUrlConfig siteUrl = getSiteUrl(); ServerSiteUrlConfig secureSiteUrlConfig = getSecureSiteUrl(); if (secureSiteUrlConfig.hasNonNullUrl()) { return secureSiteUrlConfig; } if (!secureSiteUrlConfig.hasNonNullUrl()) { return siteUrl; } return new ServerSiteUrlConfig(); } public ServerSiteUrlConfig getHttpsUrl() { ServerSiteUrlConfig siteUrlPreferSecured = getSiteUrlPreferablySecured(); return siteUrlPreferSecured.isAHttpsUrl() ? siteUrlPreferSecured : new ServerSiteUrlConfig(); } public boolean hasAnyUrlConfigured() { return siteUrl.hasNonNullUrl() || secureSiteUrl.hasNonNullUrl(); } public Double getPurgeStart() { return purgeStart; } public Double getPurgeUpto() { return purgeUpto; } public boolean isArtifactPurgingAllowed() { return !(purgeStart == null || purgeUpto == null); } public void setPurgeLimits(Double purgeStart, Double purgeUpto) { this.purgeStart = purgeStart; this.purgeUpto = purgeUpto; } public String getJobTimeout() { return jobTimeout; } /** * @deprecated Used only in tests */ public void setJobTimeout(String jobTimeout) { this.jobTimeout = jobTimeout; } public String getTimeoutType() { return "0".equals(jobTimeout) ? NEVER_TIMEOUT : OVERRIDE_TIMEOUT; } public String getAgentAutoRegisterKey() { return agentAutoRegisterKey; } public boolean shouldAutoRegisterAgentWith(String agentKey) { return (!StringUtil.isBlank(getAgentAutoRegisterKey())) && getAgentAutoRegisterKey().equals(agentKey); } public String getServerId() { return serverId; } public String getCommandRepositoryLocation() { return commandRepositoryLocation; } public void setCommandRepositoryLocation(String location) { this.commandRepositoryLocation = location; } }