package com.linkedin.databus2.client.util; /* * * Copyright 2013 LinkedIn Corp. All rights reserved * * 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. * */ import java.util.ArrayList; import java.util.List; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.GnuParser; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import com.linkedin.databus.client.DatabusClientDSCUpdater; import com.linkedin.databus.client.pub.DatabusClientGroupMember; import com.linkedin.databus.client.pub.DatabusClientNode; import com.linkedin.databus.core.Checkpoint; import com.linkedin.databus.core.DbusClientMode; import com.linkedin.databus.core.util.InvalidConfigException; public class DbusClientClusterUtil { /** * @param args * DbusClientClusterUtil -s <serverList> -n <namespace> -g <group> -d <dir> members * leader * keys * readSCN <key> * writeSCN <key> SCN [OFFSET] * remove <key> * readLastTS * writeLastTS TIMESTAMP */ public static void main(String[] args) { try { GnuParser cmdLineParser = new GnuParser(); Options options = new Options(); options.addOption("n",true,"Zookeeper namespace [/DatabusClient") .addOption("g",true,"Groupname [default-group-name] ") .addOption("d",true,"Shared directory name [shareddata] ") .addOption("s",true,"Zookeeper server list [localhost:2181] ") .addOption("h",false,"help"); CommandLine cmdLineArgs = cmdLineParser.parse(options, args,false); if (cmdLineArgs.hasOption('h')) { usage(); System.exit(0); } String namespace = cmdLineArgs.getOptionValue('n'); if (namespace==null || namespace.isEmpty()) { namespace = "/DatabusClient"; } String groupname = cmdLineArgs.getOptionValue('g'); if (groupname==null || groupname.isEmpty()) { groupname = "default-group-name"; } String sharedDir = cmdLineArgs.getOptionValue('d'); if (sharedDir==null || sharedDir.isEmpty()) { sharedDir = "shareddata"; } String serverList = cmdLineArgs.getOptionValue('s'); if (serverList==null || serverList.isEmpty()) { serverList = "localhost:2181"; } String[] fns = cmdLineArgs.getArgs(); if (fns.length < 1) { usage(); System.exit(1); } String function = fns[0]; String arg1 = (fns.length > 1) ? fns[1] : null; String arg2 = (fns.length > 2) ? fns[2] : null; try { String memberName = "cmd-line-tool"; DatabusClientNode clusterNode = new DatabusClientNode (new DatabusClientNode.StaticConfig(true,serverList, 2000, 5000, namespace, groupname, memberName,false,sharedDir)); DatabusClientGroupMember member = clusterNode.getMember(namespace,groupname,memberName); if (member == null || !member.joinWithoutLeadershipDuties()) { System.err.println("Initialization failed for: " + member); System.exit(1); } if (function.equals("members")) { List<String> mlist = member.getMembers(); for (String m: mlist) { System.out.println(m); } } else if (function.equals("leader")) { String leader = member.getLeader(); System.out.println(leader); } else if (function.equals("keys")) { List<String> keyList = member.getSharedKeys(); if (keyList != null) { for (String m: keyList) { System.out.println(m); } } } else if (function.equals("readSCN")) { List<String> keyList ; if (arg1 == null) { keyList = member.getSharedKeys(); } else { keyList = new ArrayList<String>(); keyList.add(arg1); } if (keyList != null) { for (String k: keyList) { if (!k.equals(DatabusClientDSCUpdater.DSCKEY)) { Checkpoint cp = (Checkpoint) member.readSharedData(k); if (cp != null) { System.out.println(k + " " + cp.getWindowScn() + " "+cp.getWindowOffset()); } else { System.err.println(k + " null null"); } } } } } else if (function.equals("writeSCN")) { if (arg1 != null && arg2 != null) { Checkpoint cp = new Checkpoint(); cp.setConsumptionMode(DbusClientMode.ONLINE_CONSUMPTION); cp.setWindowScn(Long.parseLong(arg2)); if (fns.length > 3) { cp.setWindowOffset(Integer.parseInt(fns[3])); } else { cp.setWindowOffset(-1); } if (member.writeSharedData(arg1, cp)) { System.out.println(arg1 + " " + cp.getWindowScn() + " " + cp.getWindowOffset()); } else { System.err.println("Write failed! " + member + " couldn't write key=" + arg1); System.exit(1); } } else { usage(); System.exit(1); } } else if (function.equals("readLastTs")) { Long timeInMs = (Long) member.readSharedData(DatabusClientDSCUpdater.DSCKEY); if (timeInMs != null) { System.out.println(DatabusClientDSCUpdater.DSCKEY + " " + timeInMs.longValue()); } else { System.err.println(DatabusClientDSCUpdater.DSCKEY + " null"); } } else if (function.equals("writeLastTs")) { if (arg1 != null) { Long ts = Long.parseLong(arg1); if (member.writeSharedData(DatabusClientDSCUpdater.DSCKEY, ts)) { System.out.println(DatabusClientDSCUpdater.DSCKEY + " " + ts); } else { System.err.println("Write failed! " + member + " couldn't write key=" + DatabusClientDSCUpdater.DSCKEY); System.exit(1); } } else { usage(); System.exit(1); } } else if (function.equals("remove")) { if (!member.removeSharedData(arg1)) { System.err.println("Remove failed! " + arg1); System.exit(1); } } else if (function.equals("create")) { if (!member.createPaths()) { System.err.println("Create path failed!" ); System.exit(1); } } else { usage(); System.exit(1); } } catch (InvalidConfigException e) { e.printStackTrace(); usage(); System.exit(1); } } catch (ParseException e) { usage(); System.exit(1); } } public static void usage() { System.err.println (" [ -n <namespace>] [-g <groupname>] [-d <shareddir>] [-s <cluster-server-list>] FUNCTION-NAME"); System.err.println(" FUNCTION-NAME one of: "); System.err.println(" members : lists members belonging to the group <groupname> "); System.err.println(" leader: lists the leader of the group <groupname> "); System.err.println(" keys: lists the keys written to shared directory <shareddir> "); System.err.println(" readSCN [<key>] : reads the SCN written to shared directory <shareddir> "); System.err.println(" writeSCN <key> <SCN> [offset] : writes the SCN written to shared directory <shareddir> "); System.err.println(" remove <[key]> : removes key ; all keys if none specified in <shareddir>"); System.err.println(" readLastTs : reads the last TS"); System.err.println(" create : create the path if none exists "); System.err.println(" writeLastTs <TIMESTAMP> : writes latest TS"); } }