package org.ophion.snitch.handlers;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.AmazonSNSClient;
import com.amazonaws.services.sns.model.PublishRequest;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.apache.commons.configuration.Configuration;
import org.ophion.snitch.util.IEventHandler;
import org.ophion.snitch.util.Log;
/**
* Date: Nov 7, 2011
* Time: 11:20:37 PM
*/
@Singleton
public class SNSEventHandler implements IEventHandler {
private AWSCredentials creds;
private Configuration config;
private static final Log LOG = new Log();
private String topic;
private Gson gson;
@Inject
public SNSEventHandler(Configuration config, AWSCredentials creds) {
this.creds = creds;
this.config = config;
this.topic = config.getString("sns.topic");
if (topic == null) {
throw new RuntimeException("could not find the desired sns topic in the config file, please add topic: arn:foo!");
}
LOG.fine("using topic: %s", topic);
boolean formatJSON = config.getBoolean("sns.format_json", false);
if (formatJSON) {
gson = new GsonBuilder().setPrettyPrinting().create();
LOG.info("using formatted json");
} else {
gson = new Gson();
}
}
@Override
public void handle(Object eventSource, Object eventArgs) {
Instance instance = (Instance) eventArgs;
LOG.fine("handling instance: %s ", instance.getInstanceId());
try {
AmazonSNS sns = new AmazonSNSClient(creds);
sns.publish(new PublishRequest(topic, gson.toJson(instance), String.format("event instance %s (%s) state: %s", instance.getInstanceId(), instance.getPrivateDnsName(), instance.getState().getName())));
} catch (Exception ex) {
LOG.severe("error publishing event:", ex);
}
}
}