/*************************GO-LICENSE-START*********************************
* Copyright 2014 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.
*************************GO-LICENSE-END***********************************/
package com.thoughtworks.go.helpers;
import com.thoughtworks.go.domain.*;
import com.thoughtworks.go.domain.exception.IllegalArtifactLocationException;
import com.thoughtworks.go.helper.JobInstanceMother;
import com.thoughtworks.go.server.dao.*;
import com.thoughtworks.go.util.SystemEnvironment;
import org.apache.commons.io.FileUtils;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.JettyWebXmlConfiguration;
import org.eclipse.jetty.webapp.WebAppContext;
import org.eclipse.jetty.webapp.WebInfConfiguration;
import org.eclipse.jetty.webapp.WebXmlConfiguration;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javax.sql.DataSource;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import static com.thoughtworks.go.helper.JobInstanceMother.completed;
import static com.thoughtworks.go.helper.PipelineMother.completedPipelineWithStagesAndBuilds;
public class Localhost {
private static final int PORT = 7493;
private static final int SSL_PORT = 8443;
private final Server server;
protected final List<String> baseStageNames;
protected final List<String> baseBuildNames;
protected final List<String> pipelineNames;
Localhost(int port, String overrideConfigFilePath, List<String> pipelineNames, List<String> baseStageNames,
List<String> baseBuildNames) throws Exception {
this.pipelineNames = pipelineNames;
this.baseStageNames = baseStageNames;
this.baseBuildNames = baseBuildNames;
File configXml = DataUtils.getConfigXmlOfWebApp();
File srcFile;
if (overrideConfigFilePath == null) {
srcFile = DataUtils.getConfigXmlAsFile();
} else {
srcFile = new File(overrideConfigFilePath);
}
FileUtils.copyFile(srcFile, configXml);
new SystemEnvironment().setProperty(SystemEnvironment.CONFIG_FILE_PROPERTY, configXml.getAbsolutePath());
new SystemEnvironment().setProperty("jdbc.port", "9003");
server = new Server(port);
WebAppContext context = new WebAppContext("webapp", "/go");
context.setConfigurationClasses(new String[]{
WebInfConfiguration.class.getCanonicalName(),
WebXmlConfiguration.class.getCanonicalName(),
JettyWebXmlConfiguration.class.getCanonicalName()
});
context.setDefaultsDescriptor("webapp/WEB-INF/webdefault.xml");
server.setHandler(context);
this.setCookieExpireIn6Months(context);
}
private void setCookieExpireIn6Months(WebAppContext wac) {
int sixMonths = 60 * 60 * 24 * 180;
wac.getSessionHandler().getSessionManager().getSessionCookieConfig().setMaxAge(sixMonths);
}
public static void main(String[] args) throws Exception {
DataUtils.cloneCCHome();
int port = PORT;
String sourceConfigFilePath = null;
int numberOfPipelines = 10;
Localhost localhost = new Localhost(port, sourceConfigFilePath,
Arrays.asList("studios", "evolve"),
Arrays.asList("mingle", "cruise", "stage3", "stage4"),
Arrays.asList("functional", "unit", "build3", "build4", "build5"));
mainAction(localhost, numberOfPipelines);
}
protected static void mainAction(Localhost localhost, int numberOfPipelines) throws Exception {
startGoServer(localhost);
// localhost.prepareSampleData(numberOfPipelines);
}
private static void startGoServer(final Localhost localhost) {
new Thread(new Runnable() {
public void run() {
try {
localhost.server.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
protected void prepareSampleData(int numberOfPipelines) throws Exception {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("classpath*:WEB-INF/applicationContext-dataLocalAccess.xml");
DataSource dataSource = (DataSource) context.getBean("dataSource");
PipelineSqlMapDao pipelineDao = (PipelineSqlMapDao) context.getBean("pipelineDao");
StageSqlMapDao stageDao = (StageSqlMapDao) context.getBean("stageDao");
JobInstanceDao jobInstanceDao = (JobInstanceDao) context.getBean("buildInstanceDao");
final DatabaseAccessHelper dbHelper = new DatabaseAccessHelper(dataSource);
dbHelper.onTearDown();
dbHelper.onSetUp();
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
try {
dbHelper.onTearDown();
} catch (Exception e) {
}
}
}));
for (int i = 0; i < numberOfPipelines; i++) {
for (String pipelineName : pipelineNames) {
createCompletedData(pipelineDao, pipelineName);
}
}
createLatestPipelines(dbHelper, jobInstanceDao);
}
protected void createLatestPipelines(DatabaseAccessHelper dbHelper,
JobInstanceDao jobInstanceDao)
throws SQLException, IllegalArtifactLocationException, IOException {
Stage mingleStage = dbHelper.saveTestPipelineWithoutSchedulingBuilds("studios", "mingle").getStages().get(0);
long mingleStageId = mingleStage.getId();
Pipeline mingle = dbHelper.getPipelineDao().mostRecentPipeline("studios");
saveBuildPlanAndCreateLogFile(mingle, completed("functional", JobResult.Failed), jobInstanceDao);
saveBuildPlanAndCreateLogFile(mingle, completed("unit", JobResult.Passed), jobInstanceDao);
long evolveStageId = dbHelper.saveTestPipeline("evolve", "dev").getStages().get(0).getId();
JobInstance building = JobInstanceMother.building("jobConfig1");
Pipeline pipeline = dbHelper.getPipelineDao().mostRecentPipeline("evolve");
jobInstanceDao.save(evolveStageId, building);
}
private void createCompletedData(PipelineDao pipelineDao, String pipelineName) throws SQLException {
pipelineDao.saveWithStages(completedPipelineWithStagesAndBuilds(pipelineName, baseStageNames, baseBuildNames));
}
private void saveBuildPlanAndCreateLogFile(Pipeline pipeline, JobInstance jobInstance,
JobInstanceDao jobInstanceDao) throws IllegalArtifactLocationException, IOException {
jobInstanceDao.save(jobInstance.getStageId(), jobInstance);
JobIdentifier jobIdentifier = new JobIdentifier(pipeline.getName(), pipeline.getLabel(),
jobInstance.getStageName(), "1", jobInstance.getName());
jobInstance.setIdentifier(jobIdentifier);
LogFileHelper.createInstanceForLocalhost().createLogFileForBuildInstance(jobInstance);
}
}