001 package org.kuali.common.deploy;
002
003 import org.kuali.common.deploy.appserver.ApplicationServer;
004 import org.kuali.common.deploy.monitoring.Monitoring;
005 import org.kuali.common.util.Assert;
006 import org.kuali.common.util.FormatUtils;
007 import org.kuali.common.util.execute.Executable;
008 import org.kuali.common.util.execute.impl.NoOpExecutable;
009 import org.kuali.common.util.maven.RepositoryUtils;
010 import org.kuali.common.util.nullify.NullUtils;
011 import org.kuali.common.util.secure.channel.SSHUtils;
012 import org.kuali.common.util.secure.channel.SecureChannel;
013 import org.slf4j.Logger;
014 import org.slf4j.LoggerFactory;
015
016 public class DefaultDeployService implements DeployService {
017
018 private static final Logger logger = LoggerFactory.getLogger(DefaultDeployService.class);
019
020 private static final Executable DEFAULT_SYS_ADMIN_EXEC = NoOpExecutable.INSTANCE;
021 private static final Executable DEFAULT_DB_RESET_EXEC = NoOpExecutable.INSTANCE;
022
023 public DefaultDeployService(DeployContext context, Monitoring monitoring, ApplicationServer appServer) {
024 this(context, DEFAULT_SYS_ADMIN_EXEC, monitoring, appServer, DEFAULT_DB_RESET_EXEC);
025 }
026
027 public DefaultDeployService(DeployContext context, Executable sysAdmin, Monitoring monitoring, ApplicationServer appServer, Executable dbReset) {
028 Assert.noNulls(context, sysAdmin, monitoring, appServer, dbReset);
029 this.context = context;
030 this.sysAdminExecutable = sysAdmin;
031 this.monitoring = monitoring;
032 this.appServer = appServer;
033 this.databaseResetExecutable = dbReset;
034 }
035
036 private final DeployContext context;
037 private final Executable sysAdminExecutable;
038 private final Monitoring monitoring;
039 private final ApplicationServer appServer;
040 private final Executable databaseResetExecutable;
041
042 @Override
043 public void deploy() {
044 SecureChannel channel = context.getChannel();
045 long start = System.currentTimeMillis();
046 logger.info("[deploy:starting]");
047 try {
048 logger.info("---------------- Deploy Application ----------------");
049 if (channel.getPort() == SSHUtils.DEFAULT_PORT) {
050 logger.info("Secure Channel - {}@{}", channel.getUsername(), channel.getHostname());
051 } else {
052 Object[] args = { channel.getUsername(), channel.getHostname(), channel.getPort() };
053 logger.info("Secure Channel - {}@{}:{}", args);
054 }
055 logger.info("Environment - {}", context.getEnvironment().getName());
056 logger.info("Application - {}", RepositoryUtils.toString(context.getApplication()));
057 if (context.getJdbcDriver().isPresent()) {
058 logger.info("Jdbc Driver - {}", RepositoryUtils.toString(context.getJdbcDriver().get()));
059 } else {
060 logger.info("Jdbc Driver - {}", NullUtils.NONE);
061 }
062 for (Deployable deployable : context.getConfigFiles()) {
063 logger.info("Config - [{}]", deployable.getLocal());
064 }
065 logger.info("----------------------------------------------------");
066 channel.open();
067 monitoring.stop();
068 appServer.stop();
069 sysAdminExecutable.execute();
070 databaseResetExecutable.execute();
071 monitoring.prepare();
072 monitoring.start();
073 appServer.prepare();
074 appServer.start();
075 } catch (Exception e) {
076 throw new IllegalStateException(e);
077 } finally {
078 channel.close();
079 }
080 logger.info("[deploy:complete] - {}", FormatUtils.getTime(System.currentTimeMillis() - start));
081 }
082
083 public static Logger getLogger() {
084 return logger;
085 }
086
087 public DeployContext getContext() {
088 return context;
089 }
090
091 public Executable getSysAdminExecutable() {
092 return sysAdminExecutable;
093 }
094
095 public Monitoring getMonitoring() {
096 return monitoring;
097 }
098
099 public ApplicationServer getAppServer() {
100 return appServer;
101 }
102
103 public Executable getDatabaseResetExecutable() {
104 return databaseResetExecutable;
105 }
106
107 }