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    }