summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Lindsey <ben.lindsey@gmail.com>2012-01-30 23:33:36 -0800
committerBryan McLellan <btm@opscode.com>2012-06-21 10:54:53 -0700
commit1fb20592554753db83e2dbdce44341befffcbfab (patch)
tree391ec3cefd12e8a3892ae6b45dd034a1e6eb7b53
parentfd3e92da0bfbab5019815b22126f18e1bf43ec42 (diff)
downloadchef-1fb20592554753db83e2dbdce44341befffcbfab.tar.gz
implemented a keep_releases configuration setting for Chef::Provider::Deploy [CHEF-2374]
-rw-r--r--chef/lib/chef/provider/deploy.rb3
-rw-r--r--chef/lib/chef/resource/deploy.rb9
-rw-r--r--chef/spec/unit/provider/deploy_spec.rb11
-rw-r--r--chef/spec/unit/resource/deploy_spec.rb14
4 files changed, 36 insertions, 1 deletions
diff --git a/chef/lib/chef/provider/deploy.rb b/chef/lib/chef/provider/deploy.rb
index 9d24a4dbd0..16ebd80e48 100644
--- a/chef/lib/chef/provider/deploy.rb
+++ b/chef/lib/chef/provider/deploy.rb
@@ -194,7 +194,8 @@ class Chef
end
def cleanup!
- all_releases[0..-6].each do |old_release|
+ chop = -1 - @new_resource.keep_releases
+ all_releases[0..chop].each do |old_release|
Chef::Log.info "#{@new_resource} removing old release #{old_release}"
FileUtils.rm_rf(old_release)
release_deleted(old_release)
diff --git a/chef/lib/chef/resource/deploy.rb b/chef/lib/chef/resource/deploy.rb
index 0993c91e6b..037c172183 100644
--- a/chef/lib/chef/resource/deploy.rb
+++ b/chef/lib/chef/resource/deploy.rb
@@ -75,6 +75,7 @@ class Chef
@provider = Chef::Provider::Deploy::Timestamped
@allowed_actions.push(:force_deploy, :deploy, :rollback)
@additional_remotes = Hash[]
+ @keep_releases = 5
end
# where the checked out/cloned code goes
@@ -295,6 +296,14 @@ class Chef
)
end
+ # The number of old release directories to keep around after cleanup
+ def keep_releases(arg=nil)
+ [set_or_return(
+ :keep_releases,
+ arg,
+ :kind_of => [ Integer ]), 1].max
+ end
+
# An array of paths, relative to your app's root, to be purged from a
# SCM clone/checkout before symlinking. Use this to get rid of files and
# directories you want to be shared between releases.
diff --git a/chef/spec/unit/provider/deploy_spec.rb b/chef/spec/unit/provider/deploy_spec.rb
index c33716e397..690e1b5454 100644
--- a/chef/spec/unit/provider/deploy_spec.rb
+++ b/chef/spec/unit/provider/deploy_spec.rb
@@ -382,6 +382,17 @@ describe Chef::Provider::Deploy do
@provider.cleanup!
end
+ it "removes all but a certain number of releases when the resource has a keep_releases" do
+ @resource.keep_releases 7
+ all_releases = ["/my/deploy/dir/20040815162342", "/my/deploy/dir/20040700000000",
+ "/my/deploy/dir/20040600000000", "/my/deploy/dir/20040500000000",
+ "/my/deploy/dir/20040400000000", "/my/deploy/dir/20040300000000",
+ "/my/deploy/dir/20040200000000", "/my/deploy/dir/20040100000000"].sort!
+ @provider.stub!(:all_releases).and_return(all_releases)
+ FileUtils.should_receive(:rm_rf).with("/my/deploy/dir/20040100000000")
+ @provider.cleanup!
+ end
+
it "fires a callback for :release_deleted when deleting an old release" do
all_releases = ["/my/deploy/dir/20040815162342", "/my/deploy/dir/20040700000000",
"/my/deploy/dir/20040600000000", "/my/deploy/dir/20040500000000",
diff --git a/chef/spec/unit/resource/deploy_spec.rb b/chef/spec/unit/resource/deploy_spec.rb
index c4ff963ad7..7809a4a233 100644
--- a/chef/spec/unit/resource/deploy_spec.rb
+++ b/chef/spec/unit/resource/deploy_spec.rb
@@ -215,4 +215,18 @@ describe Chef::Resource::Deploy do
@resource.provider.should == Chef::Provider::Deploy::Revision
end
+ it "defaults keep_releases to 5" do
+ @resource.keep_releases.should == 5
+ end
+
+ it "allows keep_releases to be set via integer" do
+ @resource.keep_releases 10
+ @resource.keep_releases.should == 10
+ end
+
+ it "enforces a minimum keep_releases of 1" do
+ @resource.keep_releases 0
+ @resource.keep_releases.should == 1
+ end
+
end