You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by br...@apache.org on 2010/01/12 23:02:28 UTC

svn commit: r898542 [2/2] - in /hadoop/zookeeper/trunk: ./ src/contrib/zktreeutil/ src/contrib/zktreeutil/src/ src/contrib/zktreeutil/tests/

Added: hadoop/zookeeper/trunk/src/contrib/zktreeutil/src/ZkTreeUtilMain.cc
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zktreeutil/src/ZkTreeUtilMain.cc?rev=898542&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zktreeutil/src/ZkTreeUtilMain.cc (added)
+++ hadoop/zookeeper/trunk/src/contrib/zktreeutil/src/ZkTreeUtilMain.cc Tue Jan 12 22:02:27 2010
@@ -0,0 +1,247 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <unistd.h>
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#include <getopt.h>
+#include <iostream>
+#include "ZkTreeUtil.h"
+
+using namespace zktreeutil;
+
+// The set of "long" options accepted by this program.
+static struct option long_options[] = {
+    {"help",         no_argument,             0, 'h'},
+    {"import",        no_argument,             0, 'I'},
+    {"export",     no_argument,             0, 'E'},
+    {"update",     no_argument,             0, 'U'},
+    {"diff",         no_argument,             0, 'F'},
+    {"dump",         no_argument,             0, 'D'},
+    {"force",         no_argument,             0, 'f'},
+    {"xmlfile",     required_argument,     0, 'x'},
+    {"path",         required_argument,     0, 'p'},
+    {"depth",         required_argument,     0, 'd'},
+    {"zookeeper", required_argument,     0, 'z'},
+    {0, 0, 0, 0}
+};
+static char *short_options = "IEUFDfx:p:d:hz:";
+
+static void usage(int argc, char *argv[])
+{
+    std::cout << "ZK-tree utility for managing ZK-tree with XML import/export," << std::endl;
+    std::cout << "viewing diff between live and saved ZK-tree and performing" << std::endl;
+    std::cout << "incremental update of the same." << std::endl;
+    std::cout << "Usage: " << argv[0] << " [args-and-values]+" << std::endl;
+    std::cout 
+        << "\t--import or -I: " 
+        << std::endl
+        << "\t  Imports the zookeeper tree from XML file. Must be specified with"
+        << std::endl
+        << "\t  --zookeeper AND --xmlfile options. Optionally takes --path for"
+        << std::endl
+        << "\t  importing subtree"
+        << std::endl;
+    std::cout 
+        << "\t--export or -E: " 
+        << std::endl
+        << "\t  Exports the zookeeper tree to XML file. Must be specified with"
+        << std::endl
+        << "\t  --zookeeper option. Optionally takes --path for exporting subtree"
+        << std::endl;
+    std::cout
+        << "\t--update or -U: "
+        << std::endl
+        << "\t  Updates zookeeper tree with changes from XML file. Update operation"
+        << std::endl
+        << "\t  is interactive unless specified with --force option. Must be speci-"
+        << std::endl
+        << "\t  fied with --zookeeper AND --xmlfile options. Optionally takes --path"
+        << std::endl
+        << "\t  for updating subtree."
+        << std::endl;
+    std::cout
+        << "\t--diff or -F: "
+        << std::endl
+        << "\t  Creates a list of diff actions on ZK tree based on XML data. Must"
+        << std::endl
+        << "\t  be specified with --zookeeper OR --xmlfile options. Optionally takes"
+        << std::endl
+        << "\t  --path for subtree diff"
+        << std::endl;
+    std::cout
+        << "\t--dump or -D: "
+        << std::endl
+        << "\t  Dumps the entire ZK (sub)tree to standard output. Must be specified"
+        << std::endl
+        << "\t  with --zookeeper OR --xmlfile options. Optionally takes --path and"
+        << std::endl
+        << "\t  --depth for dumping subtree."
+        << std::endl;
+    std::cout
+        << "\t--xmlfile=<filename> or -x <filename>: "
+        << std::endl
+        << "\t  Zookeeper tree-data XML file."
+        << std::endl;
+    std::cout
+        << "\t--path=<znodepath> or -p <znodepath>: "
+        << std::endl
+        << "\t  Path to the zookeeper subtree rootnode."
+        << std::endl;
+    std::cout
+        << "\t--depth=<tree-depth> or -d <tree-depth>: "
+        << std::endl
+        << "\t  Depth of the ZK tree to be dumped (ignored for XML dump)."
+        << std::endl;
+    std::cout
+        << "\t--force or -f: Forces cleanup before import; also used for forceful"
+        << std::endl
+        << "\t  update. Optionally be specified with --import and --update."
+        << std::endl;
+    std::cout
+        << "\t--help or -h: "
+        << std::endl
+        << "\t  prints this message"
+        << std::endl;
+    std::cout
+        << "\t--zookeeper=<zkhosts> or -z <zkhosts>: "
+        << std::endl
+        << "\t  specifies information to connect to zookeeper."
+        << std::endl;
+}
+
+int main(int argc, char **argv)
+{
+    if (argc == 1) {
+        usage(argc, argv);
+        exit(0);
+    }
+
+    // Parse the arguments.
+     int op = 0;
+     bool force = false;
+     string zkHosts;
+     string xmlFile;
+     string path = "/";
+     int depth = 0;
+     while (1)
+     {
+         int c = getopt_long(argc, argv, short_options, long_options, 0);
+         if (c == -1)
+             break;
+
+         switch (c) {
+             case 'I': op = c;
+                          break;
+             case 'E': op = c;
+                          break;
+             case 'U': op = c;
+                          break;
+             case 'F': op = c;
+                          break;
+             case 'D': op = c;
+                          break;
+             case 'f': force = true;
+                          break;
+             case 'x': xmlFile = optarg;
+                          break;
+             case 'p': path = optarg;
+                          break;
+             case 'd': depth = atoi (optarg);
+                          break;
+             case 'z': zkHosts = optarg;
+                          break;
+             case 'h': usage (argc, argv);
+                          exit(0);
+         }
+     }
+
+     ZkTreeUtil zkTreeUtil;
+     switch (op)
+     {
+         case 'I':    {
+                            if (zkHosts == "" || xmlFile == "")
+                            {
+                                std::cout << "[zktreeutil] missing params; please see usage" << std::endl;
+                                exit (-1);
+                            }
+                            zkTreeUtil.loadZkTreeXml (xmlFile);
+                            zkTreeUtil.writeZkTree (zkHosts, path, force);
+                            std::cout << "[zktreeutil] import successful!" << std::endl;
+                            break;
+                        }
+         case 'E':    {
+                            if (zkHosts == "")
+                            {
+                                std::cout << "[zktreeutil] missing params; please see usage" << std::endl;
+                                exit (-1);
+                            }
+                            zkTreeUtil.loadZkTree (zkHosts, path);
+                            zkTreeUtil.dumpZkTree (true);
+                            break;
+                        }
+         case 'U':    {
+                            if (zkHosts == "" || xmlFile == "")
+                            {
+                                std::cout << "[zktreeutil] missing params; please see usage" << std::endl;
+                                exit (-1);
+                            }
+                            zkTreeUtil.loadZkTreeXml (xmlFile);
+                            vector< ZkAction > zkActions = zkTreeUtil.diffZkTree (zkHosts, path);
+                            int flags = ZkTreeUtil::EXECUTE;
+                            if (!force) flags |= ZkTreeUtil::INTERACTIVE;
+                            zkTreeUtil.executeZkActions (zkHosts, zkActions, flags);
+                            std::cout << "[zktreeutil] update successful!" << std::endl;
+                            break;
+                        }
+         case 'F':    {
+                            if (zkHosts == "" || xmlFile == "")
+                            {
+                                std::cout << "[zktreeutil] missing params; please see usage" << std::endl;
+                                exit (-1);
+                            }
+                            zkTreeUtil.loadZkTreeXml (xmlFile);
+                            vector< ZkAction > zkActions = zkTreeUtil.diffZkTree (zkHosts, path);
+                            zkTreeUtil.executeZkActions (zkHosts, zkActions, ZkTreeUtil::PRINT);
+                            break;
+                        }
+         case 'D':    {
+                            if (zkHosts != "")
+                                zkTreeUtil.loadZkTree (zkHosts, path);
+                            else if (xmlFile != "")
+                                zkTreeUtil.loadZkTreeXml (xmlFile);
+                            else
+                            {
+                                std::cout << "[zktreeutil] missing params; please see usage" << std::endl;
+                                exit (-1);
+                            }
+                            // Dump the ZK tree
+                            if (depth) zkTreeUtil.dumpZkTree (false, depth);
+                            else zkTreeUtil.dumpZkTree (false);
+                            break;
+                        }
+     }
+
+     exit(0);
+}
+

Added: hadoop/zookeeper/trunk/src/contrib/zktreeutil/tests/zk_sample.xml
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zktreeutil/tests/zk_sample.xml?rev=898542&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zktreeutil/tests/zk_sample.xml (added)
+++ hadoop/zookeeper/trunk/src/contrib/zktreeutil/tests/zk_sample.xml Tue Jan 12 22:02:27 2010
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<root>
+  <zknode name="myapp">
+    <zknode name="version-1.0">
+      <zknode name="clientConfig">
+        <zknode name="testClient" value="cluster.id=local;server.host=localhost;server.port=4080"/>
+      </zknode>
+      <zknode name="configuration" value="v4.0">
+        <zknode name="cacheControl" value="on"/>
+        <zknode name="healthCheck" value="on"/>
+      </zknode>
+      <zknode name="distributions">
+        <zknode name="http">
+          <zknode name="goldenShards" value="0,4294967296,server,localhost:8085;"/>
+          <zknode name="versionedShards" value="33;0,4294967296,server,localhost:8086;"/>
+          <zknode name="shards" value="0,4294967296,server,localhost:8086;"/>
+        </zknode>
+      </zknode>
+      <zknode name="tmp" ignore="yes">
+        <zknode name="alerts" value="test"/>
+        <zknode name="locks"/>
+        <zknode name="transactions"/>
+      </zknode>
+    </zknode>
+  </zknode>
+  <zknode name="zookeeper" ignore="true"/>
+</root>