1 package org.kuali.common.deploy;
2
3 import org.kuali.common.deploy.appserver.ApplicationServer;
4 import org.kuali.common.deploy.monitoring.Monitoring;
5 import org.kuali.common.util.Assert;
6 import org.kuali.common.util.FormatUtils;
7 import org.kuali.common.util.execute.Executable;
8 import org.kuali.common.util.execute.impl.NoOpExecutable;
9 import org.kuali.common.util.maven.RepositoryUtils;
10 import org.kuali.common.util.nullify.NullUtils;
11 import org.kuali.common.util.secure.channel.SSHUtils;
12 import org.kuali.common.util.secure.channel.SecureChannel;
13 import org.slf4j.Logger;
14 import org.slf4j.LoggerFactory;
15
16 public class DefaultDeployService implements DeployService {
17
18 private static final Logger logger = LoggerFactory.getLogger(DefaultDeployService.class);
19
20 private static final Executable DEFAULT_SYS_ADMIN_EXEC = NoOpExecutable.INSTANCE;
21 private static final Executable DEFAULT_DB_RESET_EXEC = NoOpExecutable.INSTANCE;
22
23 public DefaultDeployService(DeployContext context, Monitoring monitoring, ApplicationServer appServer) {
24 this(context, DEFAULT_SYS_ADMIN_EXEC, monitoring, appServer, DEFAULT_DB_RESET_EXEC);
25 }
26
27 public DefaultDeployService(DeployContext context, Executable sysAdmin, Monitoring monitoring, ApplicationServer appServer, Executable dbReset) {
28 Assert.noNulls(context, sysAdmin, monitoring, appServer, dbReset);
29 this.context = context;
30 this.sysAdminExecutable = sysAdmin;
31 this.monitoring = monitoring;
32 this.appServer = appServer;
33 this.databaseResetExecutable = dbReset;
34 }
35
36 private final DeployContext context;
37 private final Executable sysAdminExecutable;
38 private final Monitoring monitoring;
39 private final ApplicationServer appServer;
40 private final Executable databaseResetExecutable;
41
42 @Override
43 public void deploy() {
44 SecureChannel channel = context.getChannel();
45 long start = System.currentTimeMillis();
46 logger.info("[deploy:starting]");
47 try {
48 logger.info("---------------- Deploy Application ----------------");
49 if (channel.getPort() == SSHUtils.DEFAULT_PORT) {
50 logger.info("Secure Channel - {}@{}", channel.getUsername(), channel.getHostname());
51 } else {
52 Object[] args = { channel.getUsername(), channel.getHostname(), channel.getPort() };
53 logger.info("Secure Channel - {}@{}:{}", args);
54 }
55 logger.info("Environment - {}", context.getEnvironment().getName());
56 logger.info("Application - {}", RepositoryUtils.toString(context.getApplication()));
57 if (context.getJdbcDriver().isPresent()) {
58 logger.info("Jdbc Driver - {}", RepositoryUtils.toString(context.getJdbcDriver().get()));
59 } else {
60 logger.info("Jdbc Driver - {}", NullUtils.NONE);
61 }
62 for (Deployable deployable : context.getConfigFiles()) {
63 logger.info("Config - [{}]", deployable.getLocal());
64 }
65 logger.info("----------------------------------------------------");
66 channel.open();
67 monitoring.stop();
68 appServer.stop();
69 sysAdminExecutable.execute();
70 databaseResetExecutable.execute();
71 monitoring.prepare();
72 monitoring.start();
73 appServer.prepare();
74 appServer.start();
75 } catch (Exception e) {
76 throw new IllegalStateException(e);
77 } finally {
78 channel.close();
79 }
80 logger.info("[deploy:complete] - {}", FormatUtils.getTime(System.currentTimeMillis() - start));
81 }
82
83 public static Logger getLogger() {
84 return logger;
85 }
86
87 public DeployContext getContext() {
88 return context;
89 }
90
91 public Executable getSysAdminExecutable() {
92 return sysAdminExecutable;
93 }
94
95 public Monitoring getMonitoring() {
96 return monitoring;
97 }
98
99 public ApplicationServer getAppServer() {
100 return appServer;
101 }
102
103 public Executable getDatabaseResetExecutable() {
104 return databaseResetExecutable;
105 }
106
107 }