Class: KnifeSharp::SharpDataBagAlign

Inherits:
Chef::Knife
  • Object
show all
Includes:
Common
Defined in:
lib/chef/knife/sharp-data_bag-align.rb

Instance Method Summary collapse

Methods included from Common

included

Instance Method Details

#check_databagsObject

Databag methods ###



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/chef/knife/sharp-data_bag-align.rb', line 21

def check_databags
  to_update = Hash.new

  unless File.exists?(data_bag_path)
    ui.warn "Bad data bag path, skipping data bag sync."
    return to_update
  end

  ui.msg(ui.color("== Data bags ==", :bold))

  updated_dbs = Hash.new
  local_dbs = Dir.glob(File.join(data_bag_path, "**/*.json")).map {|f| [File.dirname(f).split("/").last, File.basename(f, ".json")]}
  remote_dbs = Chef::DataBag.list.keys.map {|db| Chef::DataBag.load(db).keys.map{|dbi| [db, dbi]}}.flatten(1)

  if local_dbs.empty?
    ui.warn "No local data bags found, is the data bag path correct ? (#{data_bag_path})"
    return to_update
  end

  # Dump missing data bags locally
  (remote_dbs - local_dbs).each do |db|
    ui.msg "* #{db.join("/")} data bag item is remote only"
    if config[:dump_remote_only]
      ui.msg "* Dumping to #{File.join(data_bag_path, "#{db.join("/")}.json")}"
      begin
        remote_db = Chef::DataBagItem.load(db.first, db.last).raw_data
        Dir.mkdir(File.join(data_bag_path, db.first)) unless File.exists?(File.join(data_bag_path, db.first))
        File.open(File.join(data_bag_path, "#{db.join("/")}.json"), "w") do |file|
          file.puts JSON.pretty_generate(remote_db)
        end
      rescue Exception => e
        ui.error "Unable to dump #{db.join("/")} data bag item (#{e.message})"
      end
    end
  end

  # Create new data bags on server
  (local_dbs - remote_dbs).each do |db|
    begin
      local_db = JSON::load(File.read(File.join(data_bag_path, "#{db.join("/")}.json")))
      updated_dbs[db] = local_db
      ui.msg "* #{db.join("/")} data bag item is local only"
    rescue Exception => e
      ui.error "Unable to load #{db.join("/")} data bag item (#{e.message})"
    end
  end

  # Compare roles common to local and remote
  (remote_dbs & local_dbs).each do |db|
    begin
      remote_db = Chef::DataBagItem.load(db.first, db.last).raw_data
      local_db = JSON::load(File.read(File.join(data_bag_path, "#{db.join("/")}.json")))
      if remote_db != local_db
        updated_dbs[db] = local_db
        ui.msg("* #{db.join("/")} data bag item is not up-to-date")
      end
    rescue Exception => e
      ui.error "Unable to load #{db.join("/")} data bag item (#{e.message})"
    end
  end

  if sharp_config[chef_server] and sharp_config[chef_server].has_key?("ignore_databags")
    (updated_dbs.keys.map{|k| k.join("/")} & sharp_config[chef_server]["ignore_databags"]).each do |db|
      updated_dbs.delete(db.split("/"))
      ui.msg "* Skipping #{db} data bag (ignore list)"
    end
  end

  if !updated_dbs.empty?
    all = false
    updated_dbs.each do |name, obj|
      answer = nil
      answer = ui.ask_question("> Update #{name.join("/")} data bag item on server ? Y/N/(A)ll/(Q)uit ", :default => "N").upcase unless all

      if answer == "A"
        all = true
      elsif answer == "Q"
        ui.msg "* Aborting data bag alignment."
        break
      end

      if all or answer == "Y"
        to_update[name] = obj
      else
        ui.msg "* Skipping #{name.join("/")} data bag item"
      end
    end
  else
    ui.msg "* Data bags are up-to-date."
  end

  to_update
end

#runObject



15
16
17
# File 'lib/chef/knife/sharp-data_bag-align.rb', line 15

def run
  ui.error "Not implemented yet. Use ```knife sharp align -D```"
end

#update_databags(databag_list) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/chef/knife/sharp-data_bag-align.rb', line 115

def update_databags(databag_list)
  parent_databags = Chef::DataBag.list.keys
  databag_list.each do |name, obj|
    begin
      # create the parent if needed
      unless parent_databags.include?(name.first)
        db = Chef::DataBag.new
        db.name(name.first)
        db.create
        # add it to the list to avoid trying to recreate it
        parent_databags.push(name.first)
        ui.msg("* Creating data bag #{name.first}")
        log_action("creating data bag #{name.first}")
      end
      db = Chef::DataBagItem.new
      db.data_bag(name.first)
      db.raw_data = obj
      db.save
      ui.msg "* Updating #{name.join("/")} data bag item"
      log_action("updating #{name.join("/")} data bag item")
    rescue Exception => e
      ui.error "Unable to update #{name.join("/")} data bag item"
    end
  end
end