Class: Chef::Checksum
Overview
Chef::Checksum
Checksum for an individual file; e.g., used for sandbox/cookbook uploading to track which files the system already manages.
Constant Summary collapse
- DESIGN_DOCUMENT =
{ "version" => 1, "language" => "javascript", "views" => { "all" => { "map" => <<-EOJS function(doc) { if (doc.chef_type == "checksum") { emit(doc.checksum, doc); } } EOJS }, } }
Instance Attribute Summary collapse
-
#checksum ⇒ Object
Returns the value of attribute checksum.
-
#couchdb_id ⇒ Object
Returns the value of attribute couchdb_id.
-
#couchdb_rev ⇒ Object
Returns the value of attribute couchdb_rev.
-
#create_time ⇒ Object
Returns the value of attribute create_time.
-
#original_committed_file_location ⇒ Object
readonly
When a Checksum commits a sandboxed file to its final home in the checksum repo, this attribute will have the original on-disk path where the file was stored; it will be used if the commit is reverted to restore the sandbox to the pre-commit state.
Class Method Summary collapse
- .cdb_all_checksums(couchdb = nil) ⇒ Object
- .cdb_list(inflate = false, couchdb = nil) ⇒ Object
- .cdb_load(checksum, couchdb = nil) ⇒ Object
-
.create_design_document(couchdb = nil) ⇒ Object
Couchdb.
- .json_create(o) ⇒ Object
Instance Method Summary collapse
- #cdb_destroy(couchdb = nil) ⇒ Object
- #cdb_save(couchdb = nil) ⇒ Object
- #checksum_repo_directory ⇒ Object
-
#commit_sandbox_file(sandbox_file) ⇒ Object
Moves the given
sandbox_file
into the checksum repo using the path given byfile_location
and saves the Checksum to the database. -
#file_location ⇒ Object
On-Disk Checksum File Repo (Chef Server API).
-
#initialize(checksum = nil, couchdb = nil) ⇒ Checksum
constructor
Creates a new Chef::Checksum object.
-
#purge ⇒ Object
Removes the on-disk file backing this checksum object, then removes it from the database.
-
#revert_sandbox_file_commit ⇒ Object
Moves the checksum file back to its pre-commit location and deletes the checksum object from the database, effectively undoing
commit_sandbox_file
. - #to_json(*a) ⇒ Object
Constructor Details
#initialize(checksum = nil, couchdb = nil) ⇒ Checksum
Creates a new Chef::Checksum object.
Arguments
- checksum:
-
the MD5 content hash of the file
- couchdb:
-
An instance of Chef::CouchDB
Returns
- object<Chef::Checksum>
-
Duh. :)
58 59 60 61 62 |
# File 'lib/chef/checksum.rb', line 58 def initialize(checksum=nil, couchdb=nil) @create_time = Time.now.iso8601 @checksum = checksum @original_committed_file_location = nil end |
Instance Attribute Details
#checksum ⇒ Object
Returns the value of attribute checksum.
26 27 28 |
# File 'lib/chef/checksum.rb', line 26 def checksum @checksum end |
#couchdb_id ⇒ Object
Returns the value of attribute couchdb_id.
27 28 29 |
# File 'lib/chef/checksum.rb', line 27 def couchdb_id @couchdb_id end |
#couchdb_rev ⇒ Object
Returns the value of attribute couchdb_rev.
27 28 29 |
# File 'lib/chef/checksum.rb', line 27 def couchdb_rev @couchdb_rev end |
#create_time ⇒ Object
Returns the value of attribute create_time.
26 27 28 |
# File 'lib/chef/checksum.rb', line 26 def create_time @create_time end |
#original_committed_file_location ⇒ Object (readonly)
When a Checksum commits a sandboxed file to its final home in the checksum repo, this attribute will have the original on-disk path where the file was stored; it will be used if the commit is reverted to restore the sandbox to the pre-commit state.
33 34 35 |
# File 'lib/chef/checksum.rb', line 33 def original_committed_file_location @original_committed_file_location end |
Class Method Details
.cdb_all_checksums(couchdb = nil) ⇒ Object
151 152 153 154 |
# File 'lib/chef/checksum.rb', line 151 def self.cdb_all_checksums(couchdb = nil) rs = (couchdb || Chef::CouchDB.new).list("checksums", true) rs["rows"].inject({}) { |hash_result, r| hash_result[r['key']] = 1; hash_result } end |
.cdb_list(inflate = false, couchdb = nil) ⇒ Object
145 146 147 148 149 |
# File 'lib/chef/checksum.rb', line 145 def self.cdb_list(inflate=false, couchdb=nil) rs = (couchdb || Chef::CouchDB.new).list("checksums", inflate) lookup = (inflate ? "value" : "key") rs["rows"].collect { |r| r[lookup] } end |
.cdb_load(checksum, couchdb = nil) ⇒ Object
156 157 158 159 |
# File 'lib/chef/checksum.rb', line 156 def self.cdb_load(checksum, couchdb=nil) # Probably want to look for a view here at some point (couchdb || Chef::CouchDB.new).load("checksum", checksum) end |
.create_design_document(couchdb = nil) ⇒ Object
Couchdb
141 142 143 |
# File 'lib/chef/checksum.rb', line 141 def self.create_design_document(couchdb=nil) (couchdb || Chef::CouchDB.new).create_design_document("checksums", DESIGN_DOCUMENT) end |
.json_create(o) ⇒ Object
77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/chef/checksum.rb', line 77 def self.json_create(o) checksum = new(o['checksum']) checksum.create_time = o['create_time'] if o.has_key?('_rev') checksum.couchdb_rev = o["_rev"] o.delete("_rev") end if o.has_key?("_id") checksum.couchdb_id = o["_id"] o.delete("_id") end checksum end |
Instance Method Details
#cdb_destroy(couchdb = nil) ⇒ Object
161 162 163 |
# File 'lib/chef/checksum.rb', line 161 def cdb_destroy(couchdb=nil) (couchdb || Chef::CouchDB.new).delete("checksum", checksum, @couchdb_rev) end |
#cdb_save(couchdb = nil) ⇒ Object
165 166 167 |
# File 'lib/chef/checksum.rb', line 165 def cdb_save(couchdb=nil) @couchdb_rev = (couchdb || Chef::CouchDB.new).store("checksum", checksum, self)["rev"] end |
#checksum_repo_directory ⇒ Object
101 102 103 |
# File 'lib/chef/checksum.rb', line 101 def checksum_repo_directory File.join(Chef::Config.checksum_path, checksum[0..1]) end |
#commit_sandbox_file(sandbox_file) ⇒ Object
Moves the given sandbox_file
into the checksum repo using the path given by file_location
and saves the Checksum to the database
107 108 109 110 111 112 113 |
# File 'lib/chef/checksum.rb', line 107 def commit_sandbox_file(sandbox_file) @original_committed_file_location = sandbox_file Chef::Log.info("Commiting sandbox file: move #{sandbox_file} to #{file_location}") FileUtils.mkdir_p(checksum_repo_directory) File.rename(sandbox_file, file_location) cdb_save end |
#file_location ⇒ Object
On-Disk Checksum File Repo (Chef Server API)
97 98 99 |
# File 'lib/chef/checksum.rb', line 97 def file_location File.join(checksum_repo_directory, checksum) end |
#purge ⇒ Object
Removes the on-disk file backing this checksum object, then removes it from the database
132 133 134 135 |
# File 'lib/chef/checksum.rb', line 132 def purge purge_file cdb_destroy end |
#revert_sandbox_file_commit ⇒ Object
Moves the checksum file back to its pre-commit location and deletes the checksum object from the database, effectively undoing commit_sandbox_file
. Raises Chef::Exceptions::IllegalChecksumRevert if the original file location is unknown, which is will be the case if commit_sandbox_file was not previously called
120 121 122 123 124 125 126 127 128 |
# File 'lib/chef/checksum.rb', line 120 def revert_sandbox_file_commit unless original_committed_file_location raise Chef::Exceptions::IllegalChecksumRevert, "Checksum #{self.inspect} cannot be reverted because the original sandbox file location is not known" end Chef::Log.warn("Reverting sandbox file commit: moving #{file_location} back to #{original_committed_file_location}") File.rename(file_location, original_committed_file_location) cdb_destroy end |
#to_json(*a) ⇒ Object
64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/chef/checksum.rb', line 64 def to_json(*a) result = { :checksum => checksum, :create_time => create_time, :json_class => self.class.name, :chef_type => 'checksum', # For Chef::CouchDB (id_to_name, name_to_id) :name => checksum } result.to_json(*a) end |