package com.trendmicro.tme.grapheditor;
import java.io.IOException;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.JAXBException;
import com.sun.jersey.api.core.InjectParam;
import com.sun.jersey.api.view.Viewable;
import com.trendmicro.codi.CODIException;
import com.trendmicro.codi.ZNode;
import com.trendmicro.mist.proto.ZooKeeperInfo;
import com.trendmicro.mist.proto.ZooKeeperInfo.DropConfig;
import com.trendmicro.tme.broker.BrokerAdmin;
import com.trendmicro.tme.mfr.Exchange;
import com.trendmicro.tme.mfr.ExchangeFarm;
@Path("/exchange")
public class ExchangeManager {
@InjectParam ExchangeFarm exchangeFarm;
public ExchangeModel getExchange(@PathParam("name") String name) {
return new ExchangeModel(name);
}
@Path("/{name}")
@GET
@Produces(MediaType.TEXT_HTML)
public Viewable getPage(@PathParam("name") String name) throws CODIException, JAXBException, IOException {
return new Viewable("/exchange/exchange.jsp", getExchange(name));
}
@Path("/{name}/drop")
@PUT
@Consumes(MediaType.TEXT_PLAIN)
public void setDrop(@PathParam("name") String name, String policy) throws Exception {
Exchange ex = new Exchange(name);
String path = "/global/drop_exchange/" + ex.getName();
ZooKeeperInfo.DropConfig dropConfig = ZooKeeperInfo.DropConfig.newBuilder().setPolicy(policy.equals("newest") ? DropConfig.Policy.NEWEST: DropConfig.Policy.OLDEST).build();
ZNode node = new ZNode(path);
if(node.exists()) {
node.setContent(dropConfig.toString().getBytes());
}
else {
node.create(false, dropConfig.toString().getBytes());
}
String broker = exchangeFarm.getCurrentExchangeHost(ex);
if(broker != null) {
BrokerAdmin brokerAdmin = new BrokerAdmin(broker);
brokerAdmin.jmxConnectServer();
try {
if(dropConfig.getPolicy().equals(ZooKeeperInfo.DropConfig.Policy.NEWEST)) {
brokerAdmin.setExchangeAttrib(ex, "LimitBehavior", "REJECT_NEWEST");
}
else {
brokerAdmin.setExchangeAttrib(ex, "LimitBehavior", "REMOVE_OLDEST");
}
}
finally {
brokerAdmin.jmxCloseServer();
}
}
}
@Path("/{name}/drop")
@DELETE
public void setBlock(@PathParam("name") String name) throws Exception {
Exchange ex = new Exchange(name);
String path = "/global/drop_exchange/" + ex.getName();
new ZNode(path).delete();
String broker = exchangeFarm.getCurrentExchangeHost(ex);
if(broker != null) {
BrokerAdmin brokerAdmin = new BrokerAdmin(broker);
brokerAdmin.jmxConnectServer();
try {
brokerAdmin.setExchangeAttrib(ex, "LimitBehavior", "FLOW_CONTROL");
}
finally {
brokerAdmin.jmxCloseServer();
}
}
}
@Path("/{name}/size_limit")
@PUT
@Consumes(MediaType.TEXT_PLAIN)
public void setSizeLimit(@PathParam("name") String name, String sizeLimit) throws Exception {
Exchange ex = new Exchange(name);
String path = "/global/limit_exchange/" + ex.getName();
ZooKeeperInfo.TotalLimit limit = exchangeFarm.getTotalLimit(ex);
ZNode node = new ZNode(path);
if(node.exists()) {
node.setContent(limit.toBuilder().setSizeBytes(Long.valueOf(sizeLimit)).build().toString().getBytes());
}
else {
node.create(false, limit.toBuilder().setSizeBytes(Long.valueOf(sizeLimit)).build().toString().getBytes());
}
String broker = exchangeFarm.getCurrentExchangeHost(ex);
if(broker != null) {
BrokerAdmin brokerAdmin = new BrokerAdmin(broker);
brokerAdmin.jmxConnectServer();
try {
brokerAdmin.setExchangeAttrib(ex, "MaxTotalMsgBytes", Long.valueOf(sizeLimit));
}
finally {
brokerAdmin.jmxCloseServer();
}
}
}
@Path("/{name}/count_limit")
@PUT
@Consumes(MediaType.TEXT_PLAIN)
public void setCountLimit(@PathParam("name") String name, String countLimit) throws Exception {
Exchange ex = new Exchange(name);
String path = "/global/limit_exchange/" + ex.getName();
ZooKeeperInfo.TotalLimit limit = exchangeFarm.getTotalLimit(ex);
ZNode node = new ZNode(path);
if(node.exists()) {
node.setContent(limit.toBuilder().setCount(Long.valueOf(countLimit)).build().toString().getBytes());
}
else {
node.create(false, limit.toBuilder().setCount(Long.valueOf(countLimit)).build().toString().getBytes());
}
String broker = exchangeFarm.getCurrentExchangeHost(ex);
if(broker != null) {
BrokerAdmin brokerAdmin = new BrokerAdmin(broker);
brokerAdmin.jmxConnectServer();
try {
brokerAdmin.setExchangeAttrib(ex, "MaxNumMsgs", Long.valueOf(countLimit));
}
finally {
brokerAdmin.jmxCloseServer();
}
}
}
}