[Groonga-commit] droonga/droonga-engine at 71c40fa [master] Add "droonga-engine-modify-catalog" command

Back to archive index

YUKI Hiroshi null+****@clear*****
Fri Jun 27 21:32:11 JST 2014


YUKI Hiroshi	2014-06-27 21:32:11 +0900 (Fri, 27 Jun 2014)

  New Revision: 71c40fa64b989b217de0e546de37dd861f91a4d6
  https://github.com/droonga/droonga-engine/commit/71c40fa64b989b217de0e546de37dd861f91a4d6

  Message:
    Add "droonga-engine-modify-catalog" command

  Added files:
    bin/droonga-engine-modify-catalog

  Added: bin/droonga-engine-modify-catalog (+142 -0) 100755
===================================================================
--- /dev/null
+++ bin/droonga-engine-modify-catalog    2014-06-27 21:32:11 +0900 (7ada1a9)
@@ -0,0 +1,142 @@
+#!/usr/bin/env ruby
+#
+# Copyright (C) 2014 Droonga Project
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License version 2.1 as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+require "ostruct"
+require "optparse"
+require "json"
+require "tempfile"
+require "pathname"
+
+require "droonga/engine/version"
+require "droonga/catalog_generator"
+
+generator = Droonga::CatalogGenerator.new
+current_dataset = {}
+datasets = {
+  Droonga::CatalogGenerator::DEFAULT_DATASET => current_dataset
+}
+
+options = OpenStruct.new
+options.source_path = "./catalog.json"
+options.output_path = "-"
+parser = OptionParser.new
+parser.version = Droonga::Engine::VERSION
+parser.on("--source=PATH",
+          "Path to an existing catalog.json.",
+          "\"-\" means the standard input.",
+          "(#{options.source_path})") do |path|
+  options.source_path = path
+end
+parser.on("--output=PATH",
+          "Output catalog.json to PATH.",
+          "\"-\" means the standard output.",
+          "(#{options.output_path})") do |path|
+  options.output_path = path
+end
+parser.on("--dataset=NAME",
+          "Add a dataset its name is NAME.",
+          "And set the NAME to the current dataset.") do |name|
+  current_dataset = datasets[name] = {}
+end
+parser.on("--add-replica-hosts=NAME1,NAME2,...", Array,
+          "Use given hosts to be added as replicas to the current dataset.") do |hosts|
+  current_dataset[:add_replica_hosts] = hosts
+end
+parser.on("--remove-replica-hosts=NAME1,NAME2,...", Array,
+          "Use given hosts to be removed as replicas from the current dataset.") do |hosts|
+  current_dataset[:remove_replica_hosts] = hosts
+end
+parser.parse!(ARGV)
+
+
+def load_source(path)
+  source = nil
+  if path == "-"
+    source = $stdin.read
+  else
+    source_path = Pathname(path)
+    source = source_path.read
+  end
+  JSON.parse(source)
+end
+
+ADDRESS_MATCHER = /\A(.*):(\d+)\/([^\.]+)\.(.+)\z/
+def fill_dataset(options, source)
+  options[:n_workers] = source["nWorkers"]
+  options[:n_slices]  = source["replicas"].first["slices"].size
+  options[:plugins]   = source["plugins"]
+  options[:schema]    = source["schema"] if source["schema"]
+  options[:fact]      = source["fact"] if source["fact"]
+
+  nodes = source["replicas"].collect do |replica|
+    ADDRESS_MATCHER =~ replica["slices"].first["volume"]["address"]
+    {
+      :host => $1,
+      :port => $2.to_i,
+      :tag  => $3,
+      :path => $4,
+    }
+  end
+  options[:tag]   = nodes.first[:tag]
+  options[:port]  = nodes.first[:port].to_i
+  options[:hosts] = nodes.collect do |node|
+    node[:host]
+  end
+
+  if options[:add_replica_hosts]
+    options[:hosts] += options[:add_replica_hosts]
+    options[:hosts].uniq!
+  end
+  if options[:remove_replica_hosts]
+    options[:hosts] -= options[:remove_replica_hosts]
+  end
+end
+
+source = load_source(options.source_path)
+datasets.each do |name, dataset|
+  source_dataset = source["datasets"][name]
+  fill_dataset(dataset, source_dataset)
+end
+
+if datasets[Droonga::CatalogGenerator::DEFAULT_DATASET].empty?
+  datasets.delete(Droonga::CatalogGenerator::DEFAULT_DATASET)
+end
+
+
+datasets.each do |name, options|
+  generator.add_dataset(name, options)
+end
+
+def open_output(path)
+  if path == "-"
+    yield($stdout)
+  else
+    # Don't output the file directly to prevent loading of incomplete file!
+    path = Pathname(path).expand_path
+    FileUtils.mkdir_p(path.dirname.to_s)
+    Tempfile.open(path.basename.to_s, path.dirname.to_s, "w") do |output|
+      yield(output)
+      output.flush
+      File.rename(output.path, path.to_s)
+    end
+  end
+end
+
+catalog = generator.generate
+open_output(options.output_path) do |output|
+  output.puts(JSON.pretty_generate(catalog))
+end
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index