Skip to content

Commit

Permalink
Add backup attribute to file resource (close itamae-kitchen#124)
Browse files Browse the repository at this point in the history
  • Loading branch information
hico-horiuchi committed Jan 13, 2016
1 parent c4ec051 commit 0679caa
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 1 deletion.
35 changes: 35 additions & 0 deletions lib/itamae/resource/file.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
module Itamae
module Resource
class File < Base
BACKUP_PATH = '/var/itamae/backup'.freeze

define_attribute :action, default: :create
define_attribute :path, type: String, default_name: true
define_attribute :content, type: String, default: nil
define_attribute :mode, type: String
define_attribute :owner, type: String
define_attribute :group, type: String
define_attribute :backup, type: [FalseClass, Integer], default: 5
define_attribute :block, type: Proc, default: proc {}

def pre_action
Expand Down Expand Up @@ -56,6 +59,8 @@ def show_differences
end

def action_create(options)
backup if current.exist

if !current.exist && !@temppath
run_command(["touch", attributes.path])
end
Expand Down Expand Up @@ -91,6 +96,8 @@ def action_delete(options)
end

def action_edit(options)
backup if current.exist

if attributes.mode
run_specinfra(:change_file_mode, @temppath, attributes.mode)
else
Expand Down Expand Up @@ -169,6 +176,34 @@ def send_tempfile
f.unlink if f
end
end

def backup
return unless (attributes.backup).kind_of?(FalseClass) ? false : attributes.backup > 0

savetime = Time.now.strftime('%Y%m%d%H%M%S')
basename = ::File.basename(attributes.path)
backup_filename = "#{basename}.itamae-#{savetime}"
backup_path = ::File.join(BACKUP_PATH, backup_filename)

run_specinfra(:create_file_as_directory, ::File.dirname(backup_path))
run_specinfra(:copy_file, attributes.path, backup_path)
Itamae.logger.info "#{attributes.path} backed up to #{backup_path}"

backup_files = run_command(['ls', '-1', BACKUP_PATH])
backup_files = backup_files.stdout.chomp.split("\n").select { |f|
f.match("#{basename}.itamae-")
}.sort { |a, b|
b <=> a
}

if backup_files.length > attributes.backup
remainder = backup_files.slice(attributes.backup..-1)
remainder.each do |backup_to_delete|
run_specinfra(:remove_file, ::File.join(BACKUP_PATH, backup_to_delete))
Itamae.logger.info "#{attributes.path} removed backup at #{backup_path}"
end
end
end
end
end
end
6 changes: 5 additions & 1 deletion spec/integration/default_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,13 @@
end
end

describe file('/var/itamae/backup') do
it { should be_directory }
end

describe file('/tmp/file') do
it { should be_file }
its(:content) { should match(/Hello World/) }
its(:content) { should match(/Hello New World/) }
it { should be_mode 777 }
end

Expand Down
5 changes: 5 additions & 0 deletions spec/integration/recipes/default.rb
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,11 @@
mode "777"
end

file "/tmp/file" do
content "Hello New World"
mode "777"
end

execute "echo 'Hello Execute' > /tmp/execute"

file "/tmp/never_exist1" do
Expand Down

0 comments on commit 0679caa

Please sign in to comment.