class Etcdist::Writer
Writes data into etcd.
Public Class Methods
new(etcd, opts = {})
click to toggle source
@param [Hash] opts Options @opts [String] :dangerous remove data from etcd (default false) @opts [String] :dry_run perform a trial run with no changes made (default false)
# File lib/etcdist/writer.rb, line 9 def initialize(etcd, opts = {}) @etcd = etcd @dangerous = opts[:dangerous] || false @dry_run = opts[:dry_run] || false end
Public Instance Methods
delete_absent_directories(all_dirs)
click to toggle source
Deletes any directories that are present in etcd but not on the file system
# File lib/etcdist/writer.rb, line 28 def delete_absent_directories(all_dirs) dirs_to_delete = all_etcd_dirs('/').sort.reverse - all_dirs dirs_to_delete.each do |dir| Log.debug("deleting directory #{dir}") if @dangerous @etcd.delete(dir, recursive: true) if @dangerous && !@dry_run end Log.info("#{dirs_to_delete.length} directories deleted.") if @dangerous end
write(data)
click to toggle source
Writes data into etcd and optionally removes extra data from etcd @param [Hash] data of type { directory => { key => val } }
# File lib/etcdist/writer.rb, line 17 def write(data) count = { put: 0, del: 0 } data.each do |dir, entries| count[:put] += put(dir, entries) count[:del] += delete(dir, entries) if @dangerous end Log.info("#{count[:put]} entries added/modified. #{count[:del]} entries deleted.") end
Private Instance Methods
all_etcd_dirs(dir)
click to toggle source
# File lib/etcdist/writer.rb, line 59 def all_etcd_dirs(dir) root_node = @etcd.get(dir, recursive: true).node nodes_to_process_stack = [root_node] result = [] until nodes_to_process_stack.empty? node = nodes_to_process_stack.pop result.push(node.key) node.children.each { |child_node| nodes_to_process_stack.push(child_node) if child_node.dir } end result end
delete(dir, entries)
click to toggle source
# File lib/etcdist/writer.rb, line 48 def delete(dir, entries) to_delete = entries_in(dir).keys - entries.keys to_delete.each { |k| @etcd.delete([dir, '/', k].join) } unless @dry_run Log.debug("deleted #{to_delete.length} entries from #{dir}: #{to_delete}") to_delete.length end
entries_in(dir)
click to toggle source
# File lib/etcdist/writer.rb, line 55 def entries_in(dir) @etcd.exists?(dir) ? Hash[@etcd.get(dir).children.map { |n| [n.key.sub(/.*\//, ''), n.value] }] : {} end
put(dir, entries)
click to toggle source
# File lib/etcdist/writer.rb, line 40 def put(dir, entries) existing = entries_in(dir) to_put = entries.select { |k, v| existing[k] != v } to_put.each { |k, v| @etcd.set([dir, '/', k].join, value: v) } unless @dry_run Log.debug("wrote #{to_put.length} entries to #{dir}: #{to_put}") to_put.length end