knife-chef-retention 0.0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a25a99e3516a9ef83aa7115955068b1d0af9d5b8
4
- data.tar.gz: b6fd711e7a1517add25d82c0e636a3f23711c1be
3
+ metadata.gz: 2ff54c639881e87fffe4a593253d850625f5e642
4
+ data.tar.gz: aaee45b42f3fa620baaa97e2577e612a9fc8f283
5
5
  SHA512:
6
- metadata.gz: 03ac3a582771b93ad9176fbae82f4f50812b802a736e6e2bb805fe8240ca0fdc603192ab86966f3c32e64ec58a60d89c480eabd923a59263782631f4e081b501
7
- data.tar.gz: 69b451dd760fd50c14f2fab297808216b47c54a0e433c39fb9a55b691f92f8523ab60b7a49b98911b44d74e879e0a8bf5044aec680cebd0b868f4f6d2e562e59
6
+ metadata.gz: a57915b45f7229c37813a8d63425f844354f2421da19db823889885e171369f66d72405501c732b89363d8e38b41fff90c87002a6425f6cb6cab0c37f294ec70
7
+ data.tar.gz: 07ffeaddb0a8396269e83ecc9120ea4f1b35b930bfad2c491e67dacc3e60cd12e114203fdcaed0c01fa7909e6b8a80a4c6a24b07d693ce594cc66be3da61c37c
data/.rubocop.yml CHANGED
@@ -8,3 +8,5 @@ Metrics/LineLength:
8
8
  AllowURI: true
9
9
  Documentation:
10
10
  Enabled: false
11
+ Metrics/AbcSize:
12
+ Max: 18
data/CHANGELOG.md ADDED
@@ -0,0 +1,16 @@
1
+ # Change Log
2
+
3
+ ## [v0.2.0](https://github.com/cvent/knife-chef-retention/tree/v0.2.0) (2016-10-03)
4
+ [Full Changelog](https://github.com/cvent/knife-chef-retention/compare/v0.0.1...v0.2.0)
5
+
6
+ **Merged pull requests:**
7
+
8
+ - Fix regression when very few cookbook versions exist [\#5](https://github.com/cvent/knife-chef-retention/pull/5) ([brentm5](https://github.com/brentm5))
9
+ - Adds a way to keep old unused versions [\#4](https://github.com/cvent/knife-chef-retention/pull/4) ([brentm5](https://github.com/brentm5))
10
+ - Move the retention command to be under the resource it modifies [\#3](https://github.com/cvent/knife-chef-retention/pull/3) ([brentm5](https://github.com/brentm5))
11
+ - Add the initial destruction of cookbooks out of basic retention [\#1](https://github.com/cvent/knife-chef-retention/pull/1) ([brentm5](https://github.com/brentm5))
12
+
13
+ ## [v0.0.1](https://github.com/cvent/knife-chef-retention/tree/v0.0.1) (2016-09-28)
14
+
15
+
16
+ \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
data/Gemfile CHANGED
@@ -2,3 +2,10 @@
2
2
  source "https://rubygems.org"
3
3
 
4
4
  gemspec
5
+
6
+ group :development do
7
+ gem "bundler", "~> 1.6"
8
+ gem "rake", "~> 11.1"
9
+ gem "rubocop", "~> 0.38"
10
+ gem "github_changelog_generator", "~> 1.13"
11
+ end
data/README.md CHANGED
@@ -23,16 +23,36 @@ gem install knife-chef-retention
23
23
  ## Usage
24
24
 
25
25
  Everything suppose to be organized in an easy to navigate way. Everything is
26
- nested under `knife inventory` and the commands should be self documenting.
26
+ nested under its corresponding resource. For example cookbook retentions are
27
+ under `knife cookbook` and the commands should be self documenting.
28
+
27
29
  Below are some simple examples
28
30
 
29
31
  ```bash
30
- knife retention
32
+ knife cookbook
33
+
34
+ ** COOKBOOK COMMANDS **
35
+ ...
36
+ knife cookbook retention [COOKBOOK] (options)
37
+ ...
38
+
31
39
 
32
- ** RETENTION COMMANDS **
33
- knife retention cookbooks
40
+ knife cookbook retention windows
41
+ Running in Evaluation Mode no cookbooks will be deleted
42
+ Latest Version: 2.0.2
43
+ Unused Version: 1.34.8
44
+ Unused Version: 1.36.0
45
+ ...
46
+ Unused Version: 1.38.3
34
47
  ```
35
48
 
49
+ ### Options
50
+
51
+ - `--clobber` - This will actually delete cookbooks while prompting
52
+ - `-y` - This will not ask when deleting cookbooks
53
+ - `--extra-versions` - Specifies the total number of extra unused versions to keep around (Default 1)
54
+
55
+
36
56
  License and Author
37
57
  ==================
38
58
 
@@ -20,9 +20,4 @@ Gem::Specification.new do |s|
20
20
  s.required_ruby_version = "~> 2.3"
21
21
 
22
22
  s.add_dependency "chef", "~> 12.11"
23
-
24
- s.add_development_dependency "bundler", "~> 1.6"
25
- s.add_development_dependency "rake", "~> 11.1"
26
- s.add_development_dependency "rubocop", "~> 0.38"
27
- s.add_development_dependency "github_changelog_generator", "~> 1.13"
28
23
  end
@@ -3,11 +3,123 @@ require "chef/knife"
3
3
 
4
4
  class Chef
5
5
  class Knife
6
- class RetentionCookbook < Knife
7
- banner "knife retention cookbook [COOKBOOK] (options)"
6
+ class CookbookRetention < Knife
7
+ banner "knife cookbook retention [COOKBOOK] (options)"
8
+
9
+ deps do
10
+ require "chef/search/query"
11
+ require "chef/knife/search"
12
+ require "chef/cookbook_version"
13
+ end
14
+
15
+ option :clobber,
16
+ long: "--clobber",
17
+ description: "Actually delete cookbooks from the Chef Server forever",
18
+ boolean: true,
19
+ default: false
20
+
21
+ option :extra_versions,
22
+ short: "-e VALUE",
23
+ long: "--extra-versions VALUE",
24
+ description: "The number of extra versions to keep (Default: 1)",
25
+ default: 1
8
26
 
9
27
  def run
10
- ui.info "TODO: Implement this"
28
+ cookbook_name = name_args[0] if name_args.length.positive?
29
+ clobber = config[:clobber]
30
+ extra_versions = config[:extra_versions].to_i
31
+
32
+ ui.info "Running in Evaluation Mode no cookbooks will be deleted" unless clobber
33
+ ui.info "Keeping the top #{extra_versions} unused versions" if extra_versions.positive?
34
+
35
+ if cookbook_name
36
+ cleanup_cookbook(cookbook_name, extra_versions, clobber)
37
+ else
38
+ cleanup_all_cookbooks(extra_versions, clobber)
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def cleanup_all_cookbooks(extra_versions, clobber)
45
+ Chef::CookbookVersion.list.keys.each do |cookbook_name|
46
+ ui.info "Evaluating #{cookbook_name}"
47
+ cleanup_cookbook(cookbook_name, extra_versions, clobber)
48
+ ui.info ""
49
+ end
50
+ end
51
+
52
+ def cleanup_cookbook(cookbook, extra_versions, clobber)
53
+ latest_version = Chef::CookbookVersion.load(cookbook)
54
+ ui.info "Latest Version: #{latest_version.version}"
55
+
56
+ # Lets get all the cookbook versions that we could care less about
57
+ out_of_retention_cookbooks(cookbook, extra_versions).each do |version|
58
+ destroy_cookbook_version(cookbook, version[:version], clobber)
59
+ end
60
+ end
61
+
62
+ def destroy_cookbook_version(cookbook, version, clobber)
63
+ if clobber
64
+ delete_object(Chef::CookbookVersion, "#{cookbook} version #{version}", "cookbook") do
65
+ rest.delete("cookbooks/#{cookbook}/#{version}")
66
+ end
67
+ else
68
+ ui.info "Unused Version: #{version}"
69
+ end
70
+ end
71
+
72
+ def max_results
73
+ Chef::Node.list.count || 1000
74
+ end
75
+
76
+ def search_args
77
+ {
78
+ rows: max_results,
79
+ filter_result: {
80
+ name: ["name"],
81
+ cookbooks: ["cookbooks"],
82
+ ohai_time: ["ohai_time"]
83
+ }
84
+ }
85
+ end
86
+
87
+ def out_of_retention_cookbooks(cookbook, extra_versions)
88
+ # get all the version information for the cookbook
89
+ unused_versions = cookbook_versions(cookbook).take_while do |version|
90
+ # These are package that are not used and are considered old as they
91
+ # are after the first used version still
92
+ version unless version[:used]
93
+ end
94
+
95
+ save_some_versions(unused_versions, extra_versions)
96
+ end
97
+
98
+ def save_some_versions(versions, extra_versions)
99
+ # Just removes the top X which since we sort is the top X newest versions
100
+ Array(versions.slice(0, versions.length - extra_versions))
101
+ end
102
+
103
+ def cookbook_versions(cookbook_name)
104
+ nodes = all_nodes_for_cookbook(cookbook_name)
105
+ versions = Chef::CookbookVersion.available_versions(cookbook_name).map do |version|
106
+ used_by_node = nodes.any? { |n| n["cookbooks"][cookbook_name]["version"] == version }
107
+
108
+ {
109
+ version: Chef::Version.new(version),
110
+ used: used_by_node
111
+ }
112
+ end
113
+
114
+ versions.sort_by { |v| v[:version] }
115
+ end
116
+
117
+ def search_nodes(query)
118
+ Chef::Search::Query.new.search(:node, query, search_args).first
119
+ end
120
+
121
+ def all_nodes_for_cookbook(cookbook_name)
122
+ search_nodes("cookbooks_#{cookbook_name}:*")
11
123
  end
12
124
  end
13
125
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module Knife
3
3
  module ChefRetention
4
- VERSION = "0.0.1"
4
+ VERSION = "0.2.0"
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-chef-retention
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brent Montague
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-28 00:00:00.000000000 Z
11
+ date: 2016-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef
@@ -24,62 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '12.11'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.6'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.6'
41
- - !ruby/object:Gem::Dependency
42
- name: rake
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '11.1'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '11.1'
55
- - !ruby/object:Gem::Dependency
56
- name: rubocop
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '0.38'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '0.38'
69
- - !ruby/object:Gem::Dependency
70
- name: github_changelog_generator
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.13'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.13'
83
27
  description: A knife plugin to handle deleting of items in a safe manor
84
28
  email: bmontague@cvent.com
85
29
  executables: []
@@ -91,6 +35,7 @@ files:
91
35
  - ".rubocop.yml"
92
36
  - ".ruby-version"
93
37
  - ".travis.yml"
38
+ - CHANGELOG.md
94
39
  - Gemfile
95
40
  - LICENSE
96
41
  - README.md