Class: Chef::Checksum

Inherits:
Object show all
Defined in:
lib/chef/checksum.rb

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

Class Method Summary collapse

Instance Method Summary collapse

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

#checksumObject

Returns the value of attribute checksum.



26
27
28
# File 'lib/chef/checksum.rb', line 26

def checksum
  @checksum
end

#couchdb_idObject

Returns the value of attribute couchdb_id.



27
28
29
# File 'lib/chef/checksum.rb', line 27

def couchdb_id
  @couchdb_id
end

#couchdb_revObject

Returns the value of attribute couchdb_rev.



27
28
29
# File 'lib/chef/checksum.rb', line 27

def couchdb_rev
  @couchdb_rev
end

#create_timeObject

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_locationObject (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_directoryObject



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_locationObject

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

#purgeObject

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_commitObject

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