package org.deephacks.westty.whirr;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import org.apache.commons.configuration.Configuration;
import org.apache.whirr.Cluster;
import org.apache.whirr.Cluster.Instance;
import org.apache.whirr.service.ClusterActionEvent;
import org.apache.whirr.service.ClusterActionHandlerSupport;
import org.apache.whirr.service.FirewallManager.Rule;
import org.deephacks.westty.config.ClusterConfig;
import org.deephacks.westty.config.ServerConfig;
import org.deephacks.westty.config.SockJsConfig;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import static org.apache.whirr.RolePredicates.role;
import static org.jclouds.scriptbuilder.domain.Statements.call;
/**
* Westty cluster action handler which configures westty by unpacking a binary tarball and
* setting WESTTY_HOME and PATH environment variables.
*/
public class WesttyService extends ClusterActionHandlerSupport {
public final static String WESTTY_ROLE = "westty";
final static String WESTTY_DEFAULT_PROPERTIES = "whirr-westty-default.properties";
final static int WESTTY_HTTP_PORT = 80;
final static String WESTTY_TAR_URL = "whirr.westty.tarball.url";
final static String URL_FLAG = "-u";
@Override
public String getRole() {
return WESTTY_ROLE;
}
@Override
protected void beforeConfigure(ClusterActionEvent event) throws IOException {
Cluster cluster = event.getCluster();
Set<Instance> instances = cluster.getInstancesMatching(role(WESTTY_ROLE));
// FIXME:
ClusterConfig config = new ClusterConfig();
// event.getStatementBuilder().addExport(ClusterConfig.CLUSTER_SERVERS_PROP, generateClusterIds(instances));
event.getStatementBuilder().addExport("FIXME", generateClusterIds(instances));
event.getFirewallManager().addRules(
Rule.create().destination(instances).ports(WESTTY_HTTP_PORT));
event.getFirewallManager().addRules(
Rule.create().destination(instances).ports(SockJsConfig.DEFAULT_HTTP_PORT));
// FIXME::
// event.getFirewallManager().addRules(
// Rule.create().destination(instances).ports(ProtobufConfig.DEFAULT_PORT));
// for (Instance instance : instances) {
// String ip = instance.getPublicIp();
// event.getStatementBuilder()
// .addExportPerInstance(instance.getId(), WESTTY_PUBLIC_IP, ip);
// }
handleFirewallRules(event);
addStatement(event, call("retry_helpers"));
addStatement(event, call("install_westty"));
addStatement(event, call("install_nginx"));
}
@Override
protected void beforeBootstrap(ClusterActionEvent event) throws IOException,
InterruptedException {
Configuration conf = getConfiguration(event.getClusterSpec(), WESTTY_DEFAULT_PROPERTIES);
addStatement(event, call("retry_helpers"));
addStatement(event, call("install_tarball"));
addStatement(event, call("install_jre7"));
String tarball = prepareRemoteFileUrl(event, conf.getString(WESTTY_TAR_URL));
addStatement(event, call("configure_westty", URL_FLAG, tarball));
}
@Override
protected void beforeStart(ClusterActionEvent event) throws IOException {
addStatement(event, call("start_nginx"));
}
private String generateClusterIds(Set<Instance> instances) {
return Joiner.on(',').join(getPrivateHosts(instances));
}
private static List<String> getPrivateHosts(Set<Instance> instances) {
return Lists.transform(Lists.newArrayList(instances), new Function<Instance, String>() {
@Override
public String apply(Instance instance) {
String host = instance.getPrivateIp();
return String.format("%s:%d", host, ServerConfig.DEFAULT_CLUSTER_PORT);
}
});
}
}