/**
* Copyright (C) 2010 EdgyTech LLC.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.edgytech.umongo;
import com.edgytech.swingfast.ButtonBase;
import com.edgytech.swingfast.ConfirmDialog;
import com.edgytech.swingfast.EnumListener;
import com.edgytech.swingfast.InfoDialog;
import com.edgytech.swingfast.Menu;
import com.edgytech.swingfast.Text;
import com.edgytech.swingfast.XmlComponentUnit;
import com.mongodb.BasicDBObject;
import com.mongodb.CommandResult;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.ServerAddress;
import javax.swing.JPanel;
import com.edgytech.umongo.ServerPanel.Item;
import com.mongodb.*;
import java.io.IOException;
import java.util.logging.Level;
/**
*
* @author antoine
*/
public class ServerPanel extends BasePanel implements EnumListener<Item> {
enum Item {
icon,
host,
address,
maxObjectSize,
journaling,
replication,
clientPorts,
rsConfig,
rsStatus,
rsOplogInfo,
refresh,
rsStepDown,
rsFreeze,
rsFreezeTime,
initiate,
initConfig,
rsRemove,
rsReconfigure,
isMaster,
serverStatus,
serverBuildInfo,
currentOps,
currentOpsQuery,
killOp,
killOpId,
getParameter,
getParameterValue,
setParameter,
setParameterValue,
setLogLevel,
setLogLevelValue,
getLog,
getLogType,
logRotate,
replica,
shutdown,
shutdownForce,
shutdownTimeout,
shutdownConfirm,
fsync,
fsyncAndLock,
}
public ServerPanel() {
setEnumBinding(Item.values(), this);
}
public ServerNode getServerNode() {
return (ServerNode) getNode();
}
@Override
protected void updateComponentCustom(JPanel comp) {
try {
ServerNode node = getServerNode();
if (node.isConfig) {
((Menu)getBoundUnit(Item.replica)).enabled = false;
}
MongoClient svrMongo = node.getServerMongoClient();
ServerAddress addr = getServerNode().getServerAddress();
if (addr != null) {
setStringFieldValue(Item.host, addr.toString());
setStringFieldValue(Item.address, addr.getSocketAddress().toString());
}
CommandResult res = svrMongo.getDB("local").command("isMaster");
boolean master = res.getBoolean("ismaster");
String replication = MongoUtils.makeInfoString("master", master,
"secondary", res.getBoolean("secondary"),
"passive", res.getBoolean("passive"));
setStringFieldValue(Item.replication, replication);
((Text) getBoundUnit(Item.replication)).showIcon = master;
setStringFieldValue(Item.maxObjectSize, String.valueOf(svrMongo.getMaxBsonObjectSize()));
// ((CmdField) getBoundUnit(Item.serverStatus)).updateFromCmd(svrMongo);
//
// DBObject svrStatus = ((DocField) getBoundUnit(Item.serverStatus)).getDoc();
// boolean dur = svrStatus.containsField("dur");
// ((Text)getBoundUnit(Item.journaling)).setStringValue(dur ? "On" : "Off");
// ((Text)getBoundUnit(Item.journaling)).showIcon = dur;
} catch (Exception e) {
UMongo.instance.showError(this.getClass().getSimpleName() + " update", e);
}
}
public void actionPerformed(Item enm, XmlComponentUnit unit, Object src) {
}
public void rsStepDown(ButtonBase button) {
final DBObject cmd = new BasicDBObject("replSetStepDown", 1);
final DB admin = getServerNode().getServerMongoClient().getDB("admin");
new DbJob() {
@Override
public Object doRun() {
Object res = null;
try {
res = admin.command(cmd);
} catch (MongoException.Network e) {
res = "Operation was likely successful, but connection error: " + e.toString();
}
try {
// sleep a bit since it takes time for driver to see change
Thread.sleep(6000);
} catch (InterruptedException ex) {
getLogger().log(Level.WARNING, null, ex);
}
return res;
}
@Override
public String getNS() {
return null;
}
@Override
public String getShortName() {
return "RS Step Down";
}
@Override
public DBObject getRoot(Object result) {
return cmd;
}
}.addJob();
}
public void rsFreeze(ButtonBase button) {
int sec = getIntFieldValue(Item.rsFreezeTime);
DBObject cmd = new BasicDBObject("replSetFreeze", sec);
new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), cmd).addJob();
}
public void getLog(ButtonBase button) {
final DB db = getServerNode().getServerMongoClient().getDB("admin");
final String type = getStringFieldValue(Item.getLogType);
final DBObject cmd = new BasicDBObject("getLog", type);
new DbJob() {
@Override
public Object doRun() throws Exception {
CommandResult res = db.command(cmd);
res.throwOnError();
StringBuilder sb = new StringBuilder();
BasicDBList list = (BasicDBList) res.get("log");
for (Object str : list){
sb.append(str);
sb.append("\n");
}
return sb.toString();
}
@Override
public String getNS() {
return db.getName();
}
@Override
public String getShortName() {
return cmd.keySet().iterator().next();
}
}.addJob();
}
public void serverStatus(ButtonBase button) {
new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), "serverStatus").addJob();
}
public void serverBuildInfo(ButtonBase button) {
new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), "buildinfo").addJob();
}
public void isMaster(ButtonBase button) {
new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), "isMaster").addJob();
}
public void rsConfig(ButtonBase button) {
final DBCollection col = getServerNode().getServerMongoClient().getDB("local").getCollection("system.replset");
CollectionPanel.doFind(col, null);
}
public void rsStatus(ButtonBase button) {
new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), "replSetGetStatus").addJob();
}
public void rsOplogInfo(ButtonBase button) {
new DocView(null, "Oplog Info", null, "Oplog of " + getServerNode().getServerAddress(), MongoUtils.getReplicaSetInfo(getServerNode().getServerMongoClient())).addToTabbedDiv();
}
public void setParameter(ButtonBase button) {
BasicDBObject cmd = new BasicDBObject("setParameter", 1);
DBObject param = ((DocBuilderField) getBoundUnit(Item.setParameterValue)).getDBObject();
cmd.putAll(param);
new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), cmd).addJob();
}
public void getParameter(ButtonBase button) {
BasicDBObject cmd = new BasicDBObject("getParameter", 1);
String param = getStringFieldValue(Item.getParameterValue);
if ("*".equals(param))
cmd.put("getParameter", "*");
else
cmd.put(param, 1);
new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), cmd).addJob();
}
public void setLogLevel(ButtonBase button) {
BasicDBObject cmd = new BasicDBObject("setParameter", 1);
int level = getIntFieldValue(Item.setLogLevelValue);
cmd.put("logLevel", level);
new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), cmd).addJob();
}
public void currentOps(ButtonBase button) {
final MongoClient mongo = getServerNode().getServerMongoClient();
final DBObject query = ((DocBuilderField) getBoundUnit(Item.currentOpsQuery)).getDBObject();
CollectionPanel.doFind(mongo.getDB("admin").getCollection("$cmd.sys.inprog"), query);
}
public void killOp(ButtonBase button) {
final MongoClient mongo = getServerNode().getServerMongoClient();
final int opid = getIntFieldValue(Item.killOpId);
final DBObject query = new BasicDBObject("op", opid);
CollectionPanel.doFind(mongo.getDB("admin").getCollection("$cmd.sys.killop"), query);
}
public void rsRemove(ButtonBase button) throws Exception {
ReplSetNode replset = (ReplSetNode) getServerNode().getParentNode();
final DBCollection col = replset.getMongoClient().getDB("local").getCollection("system.replset");
DBObject config = col.findOne();
BasicDBList members = (BasicDBList) config.get("members");
int i = 0;
String myhost = getServerNode().getServerAddress().getHost() + ":" + getServerNode().getServerAddress().getPort();
for (; i < members.size(); ++i) {
if (myhost.equals(((DBObject)members.get(i)).get("host")))
break;
}
if (i == members.size()) {
throw new Exception("No such server in configuration");
}
members.remove(i);
ReplSetPanel.reconfigure(replset, config);
}
public void initiate(ButtonBase button) {
DBObject config = ((DocBuilderField)getBoundUnit(Item.initConfig)).getDBObject();
DBObject cmd = new BasicDBObject("replSetInitiate", config);
DB admin = getServerNode().getServerMongoClient().getDB("admin");
new DbJobCmd(admin, cmd, this, null).addJob();
}
public void rsReconfigure(ButtonBase button) throws Exception {
ReplSetNode replset = (ReplSetNode) getServerNode().getParentNode();
final DBCollection col = replset.getMongoClient().getDB("local").getCollection("system.replset");
DBObject config = col.findOne();
BasicDBList members = (BasicDBList) config.get("members");
int i = 0;
String myhost = getServerNode().getServerAddress().getHost() + ":" + getServerNode().getServerAddress().getPort();
for (; i < members.size(); ++i) {
if (myhost.equals(((DBObject)members.get(i)).get("host")))
break;
}
if (i == members.size()) {
throw new Exception("No such server in configuration");
}
ReplicaDialog dia = UMongo.instance.getGlobalStore().getReplicaDialog();
BasicDBObject oldConf = (BasicDBObject) members.get(i);
dia.updateFromReplicaConfig(oldConf);
if (!dia.show())
return;
BasicDBObject conf = dia.getReplicaConfig(oldConf.getInt("_id"));
members.put(i, conf);
ReplSetPanel.reconfigure(replset, config);
}
public void shutdown(ButtonBase button) {
BasicDBObject cmd = new BasicDBObject("shutdown", 1);
boolean force = getBooleanFieldValue(Item.shutdownForce);
if (force)
cmd.put("force", force);
int timeout = getIntFieldValue(Item.shutdownTimeout);
if (timeout > 0)
cmd.put("timeoutSecs", timeout);
ConfirmDialog dia = (ConfirmDialog) getBoundUnit(Item.shutdownConfirm);
if (!dia.show())
return;
new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), cmd).addJob();
}
public void logRotate(ButtonBase button) {
new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), "logRotate").addJob();
}
public void fsync(ButtonBase button) {
DBObject cmd = new BasicDBObject("fsync", 1);
if (false) {
cmd.put("async", 1);
}
DB admin = getServerNode().getServerMongoClient().getDB("admin");
new DbJobCmd(admin, cmd).addJob();
}
public void fsyncAndLock(ButtonBase button) {
if (!UMongo.instance.getGlobalStore().confirmLockingOperation()) {
return;
}
new DbJob() {
@Override
public Object doRun() throws IOException {
MongoClient mongo = getServerNode().getServerMongoClient();
boolean locked = mongo.isLocked();
if (locked) {
return mongo.unlock();
}
return mongo.fsyncAndLock();
}
@Override
public String getNS() {
return null;
}
@Override
public String getShortName() {
return "FSync And Lock";
}
@Override
public void wrapUp(Object res) {
try {
// looks like the unlock doesnt take effect right away
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
super.wrapUp(res);
}
}.addJob();
}
}