package com.jivesoftware.os.amza.ui.region;
import com.google.common.base.Optional;
import com.google.common.collect.Maps;
import com.jivesoftware.os.amza.api.ring.RingHost;
import com.jivesoftware.os.amza.api.ring.RingMember;
import com.jivesoftware.os.amza.api.ring.RingMemberAndHost;
import com.jivesoftware.os.amza.service.ring.AmzaRingReader;
import com.jivesoftware.os.amza.service.ring.AmzaRingWriter;
import com.jivesoftware.os.amza.service.ring.RingTopology;
import com.jivesoftware.os.amza.ui.soy.SoyRenderer;
import com.jivesoftware.os.mlogger.core.MetricLogger;
import com.jivesoftware.os.mlogger.core.MetricLoggerFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
*/
// soy.page.amzaClusterPluginRegion
public class AmzaClusterPluginRegion implements PageRegion<Optional<AmzaClusterPluginRegion.AmzaClusterPluginRegionInput>> {
private static final MetricLogger LOG = MetricLoggerFactory.getLogger();
private final String template;
private final SoyRenderer renderer;
private final AmzaRingWriter ringWriter;
private final AmzaRingReader ringReader;
public AmzaClusterPluginRegion(String template,
SoyRenderer renderer,
AmzaRingWriter ringWriter,
AmzaRingReader ringReader) {
this.template = template;
this.renderer = renderer;
this.ringWriter = ringWriter;
this.ringReader = ringReader;
}
public static class AmzaClusterPluginRegionInput {
final String member;
final String host;
final int port;
final String action;
public AmzaClusterPluginRegionInput(String member, String host, int port, String action) {
this.member = member;
this.host = host;
this.port = port;
this.action = action;
}
}
@Override
public String render(Optional<AmzaClusterPluginRegionInput> optionalInput) {
Map<String, Object> data = Maps.newHashMap();
try {
if (optionalInput.isPresent()) {
AmzaClusterPluginRegionInput input = optionalInput.get();
if (input.action.equals("add")) {
ringWriter.register(new RingMember(input.member), new RingHost("", "", input.host, input.port), -1, false);
} else if (input.action.equals("remove")) {
ringWriter.deregister(new RingMember(input.member));
}
List<Map<String, String>> rows = new ArrayList<>();
RingTopology ring = ringReader.getRing(AmzaRingReader.SYSTEM_RING, -1);
for (RingMemberAndHost entry : ring.entries) {
Map<String, String> row = new HashMap<>();
row.put("member", entry.ringMember.getMember());
row.put("datacenter", entry.ringHost.getDatacenter());
row.put("rack", entry.ringHost.getRack());
row.put("host", entry.ringHost.getHost());
row.put("port", String.valueOf(entry.ringHost.getPort()));
rows.add(row);
}
data.put("ring", rows);
}
} catch (Exception e) {
LOG.error("Unable to retrieve data", e);
}
return renderer.render(template, data);
}
@Override
public String getTitle() {
return "Amza Cluster";
}
}