knife-tidy 0.2.4 → 0.3.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: 13a4147cae7f0309f48d49dfc0e014b0afa8d62b
4
- data.tar.gz: '009379a697f1930e43f149ef2c072eb75238afba'
3
+ metadata.gz: b7f8cd82c1128a57a08b0f4d566b6f4c0fab57e0
4
+ data.tar.gz: '00768c3e853bb6bdbde3d183f84094a933e6b08f'
5
5
  SHA512:
6
- metadata.gz: dcbb69f54629feffb1d4709445f8dab998826898fbfaa2c6a4bd195deeb2ac39c88d341b49174feea4cb0fd15d394e481d5aa38e5905d3552dab91bfc9d54f3c
7
- data.tar.gz: a1edef340c2bd84270101ff2f7359d3ad990ad9ff07142b42085df01fd11ab56d55de80df057f2cc66e6d2d1fea075293e4792dd779042d4ef3699175ed25fc8
6
+ metadata.gz: 10ae87a0e2bc3248cc63aa67817e61567ea631df7bb5e644947e97aae7f43db29c3bfec3ef7f78ab4e52aeaf5f690d2d03d1d51bd5e3d41646083eecd1895eb1
7
+ data.tar.gz: 9719b04e58c3c9227a6c2839bbb3e0b02e21487885fcb94f7c20a15d5279754c431cff97f4988fa369b4e42710cb6b004c7f4ea898f34db565170971283df5c2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Change Log
2
2
 
3
+ ## [0.1.0](https://github.com/chef-customers/knife-tidy/tree/0.1.0) (2017-09-14)
4
+ [Full Changelog](https://github.com/chef-customers/knife-tidy/compare/0.2.4...0.1.0)
5
+
6
+ **Closed issues:**
7
+
8
+ - FATAL: Cannot find subcommand for: 'tidy backup clean' [\#12](https://github.com/chef-customers/knife-tidy/issues/12)
9
+
10
+ **Merged pull requests:**
11
+
12
+ - bump to 0.3.0 [\#19](https://github.com/chef-customers/knife-tidy/pull/19) ([jeremymv2](https://github.com/jeremymv2))
13
+ - added dry-run to server clean [\#18](https://github.com/chef-customers/knife-tidy/pull/18) ([jeremymv2](https://github.com/jeremymv2))
14
+
3
15
  ## [0.2.4](https://github.com/chef-customers/knife-tidy/tree/0.2.4) (2017-09-12)
4
16
  [Full Changelog](https://github.com/chef-customers/knife-tidy/compare/0.2.3...0.2.4)
5
17
 
@@ -3,12 +3,24 @@
3
3
  "organizations/*/cookbooks/chef-sugar*/metadata.rb":[
4
4
  {
5
5
  "pattern":"^require .*/lib/chef/sugar/version",
6
- "replace":"# require File.expand_path('../lib/chef/sugar/version', __FILE__)"
6
+ "replace":"# require File.expand_path('../lib/chef/sugar/version', *__FILE__)"
7
7
  },
8
8
  {
9
9
  "pattern":"version *Chef::Sugar::VERSION",
10
10
  "replace":"version !COOKBOOK_VERSION!"
11
11
  }
12
12
  ]
13
+ },
14
+ "io-read-version-and-readme.md":{
15
+ "organizations/*/cookbooks/*/metadata.rb":[
16
+ {
17
+ "pattern":"^version +IO.read.* 'VERSION'.*",
18
+ "replace":"version !COOKBOOK_VERSION!"
19
+ },
20
+ {
21
+ "pattern":"^long_description +IO.read.* 'README.md'.*",
22
+ "replace":"#long_description \"A Long Description..\""
23
+ }
24
+ ]
13
25
  }
14
26
  }
@@ -10,6 +10,7 @@ class Chef
10
10
  require 'chef/tidy_substitutions'
11
11
  require 'chef/tidy_acls'
12
12
  require 'ffi_yajl'
13
+ require 'fileutils'
13
14
  end
14
15
 
15
16
  banner "knife tidy backup clean (OPTIONS)"
@@ -25,6 +26,7 @@ class Chef
25
26
  :description => 'The path to the file used for substitutions. If non-existant, a boiler plate one will be created.'
26
27
 
27
28
  def run
29
+
28
30
  unless config[:backup_path] && ::File.directory?(config[:backup_path])
29
31
  ui.error 'Must specify valid --backup-path'
30
32
  exit 1
@@ -47,8 +49,8 @@ class Chef
47
49
  org_acls.validate_user_acls
48
50
  fix_self_dependencies(org)
49
51
  fix_cookbook_names(org)
50
- load_cookbooks(org)
51
52
  generate_new_metadata(org)
53
+ load_cookbooks(org)
52
54
  end
53
55
 
54
56
  completion_message
@@ -106,13 +108,12 @@ class Chef
106
108
  puts "INFO: Loading #{cookbook}"
107
109
  ret = cl.load_cookbook(cookbook)
108
110
  if ret.nil?
109
- puts "ACTION NEEDED: Something's wrong with the #{cookbook} cookbook - cannot load it! Moving to cookbooks.broken folder."
111
+ action_needed("ACTION NEEDED: Something's wrong with the #{cookbook} cookbook - cannot load it! Moving to cookbooks.broken folder.")
110
112
  broken_cookooks_add(org, cookbook)
111
113
  end
112
114
  end
113
115
  rescue LoadError => e
114
116
  ui.error e
115
- puts 'ACTION NEEDED: Look at the cookbook above and determine what in the metadata.rb is causing the exception and rectify manually'
116
117
  exit 1
117
118
  end
118
119
 
@@ -168,7 +169,9 @@ class Chef
168
169
  end
169
170
 
170
171
  def substitutions_file
171
- @substitutions_file ||= ::File.expand_path(config[:gsub_file])
172
+ sub_file_path = ::File.expand_path(config[:gsub_file])
173
+ ui.error "Subtitutions file #{sub_file_path} does not exist!" unless ::File.exist?(sub_file_path)
174
+ @substitutions_file ||= sub_file_path
172
175
  end
173
176
 
174
177
  def orgs
@@ -195,6 +198,16 @@ class Chef
195
198
  yield cookbook
196
199
  end
197
200
  end
201
+
202
+ def action_needed_file_path
203
+ ::File.expand_path('knife-tidy-actions-needed.txt')
204
+ end
205
+
206
+ def action_needed(msg)
207
+ ::File.open(action_needed_file_path, 'a') do |f|
208
+ f.write(msg)
209
+ end
210
+ end
198
211
  end
199
212
  end
200
213
  end
@@ -26,6 +26,10 @@ class Chef
26
26
  :long => '--only-nodes',
27
27
  :description => 'Only delete stale nodes from Chef Server.'
28
28
 
29
+ option :dry_run,
30
+ :long => '--dry-run',
31
+ :description => 'Do not perform any actual deletion, only report on what would have been deleted.'
32
+
29
33
  def run
30
34
  # not enabled
31
35
  ui.warn "This feature is not enabled"
@@ -34,9 +38,9 @@ class Chef
34
38
  STDOUT.sync = true
35
39
 
36
40
  ensure_reports_dir
37
- ui.info "Reading from #{tidy.reports_dir} directory"
41
+ puts "INFO: Reading from #{tidy.reports_dir} directory"
38
42
 
39
- ui.info "Using thread concurrency #{config[:concurrency]}"
43
+ puts "INFO: Using thread concurrency #{config[:concurrency]}"
40
44
  configure_chef
41
45
 
42
46
  if config[:only_cookbooks] && config[:only_nodes]
@@ -64,7 +68,7 @@ class Chef
64
68
  queue = Chef::Util::ThreadedJobQueue.new
65
69
  unused_cookbooks_file = ::File.join(tidy.reports_dir, "#{org}_unused_cookbooks.json")
66
70
  return unless ::File.exist?(unused_cookbooks_file)
67
- ui.info "Cleaning cookbooks for Org: #{org}, using #{unused_cookbooks_file}"
71
+ puts "INFO: Cleaning cookbooks for Org: #{org}, using #{unused_cookbooks_file}"
68
72
  unused_cookbooks = FFI_Yajl::Parser.parse(::File.read(unused_cookbooks_file), symbolize_names: true)
69
73
  unused_cookbooks.keys.each do |cookbook|
70
74
  versions = unused_cookbooks[cookbook]
@@ -77,11 +81,16 @@ class Chef
77
81
 
78
82
  def delete_cookbook_job(org, cookbook, version)
79
83
  path = "/organizations/#{org}/cookbooks/#{cookbook}/#{version}"
84
+ if config[:dry_run]
85
+ printf("INFO: Would have executed `rest.delete(#{path})`\n")
86
+ return
87
+ end
80
88
  rest.delete(path)
81
89
  response = '200'
82
90
  rescue Net::HTTPServerException
83
91
  response = $!.response.code
84
92
  ensure
93
+ return if config[:dry_run]
85
94
  formatted = response == '200' ?
86
95
  ui.color(' Deleting %-20s %-10s %10s', :green) :
87
96
  ui.color(' Deleting %-20s %-10s %10s', :red)
@@ -92,7 +101,7 @@ class Chef
92
101
  queue = Chef::Util::ThreadedJobQueue.new
93
102
  stale_nodes_file = ::File.join(tidy.reports_dir, "#{org}_stale_nodes.json")
94
103
  return unless ::File.exist?(stale_nodes_file)
95
- ui.info "Cleaning stale nodes for Org: #{org}, using #{stale_nodes_file}"
104
+ puts "INFO: Cleaning stale nodes for Org: #{org}, using #{stale_nodes_file}"
96
105
  stale_nodes = FFI_Yajl::Parser.parse(::File.read(stale_nodes_file), symbolize_names: true)
97
106
  stale_nodes[:list].each do |node|
98
107
  queue << lambda { delete_node_job(org, node) }
@@ -102,11 +111,16 @@ class Chef
102
111
 
103
112
  def delete_node_job(org, node)
104
113
  path = "/organizations/#{org}/nodes/#{node}"
114
+ if config[:dry_run]
115
+ printf("INFO: Would have executed `rest.delete(#{path})`\n")
116
+ return
117
+ end
105
118
  rest.delete(path)
106
119
  response = '200'
107
120
  rescue Net::HTTPServerException
108
121
  response = $!.response.code
109
122
  ensure
123
+ return if config[:dry_run]
110
124
  formatted = response == '200' ?
111
125
  ui.color(' Deleting %-20s %10s', :green) :
112
126
  ui.color(' Deleting %-20s %10s', :red)
@@ -15,7 +15,7 @@ class Chef
15
15
  end
16
16
 
17
17
  def load_data
18
- Chef::Log.info "Loading substitutions from #{file_path}"
18
+ puts "INFO: Loading substitutions from #{file_path}"
19
19
  @data = FFI_Yajl::Parser.parse(::File.read(@file_path), symbolize_names: false)
20
20
  rescue Errno::ENOENT
21
21
  raise NoSubstitutionFile, file_path
@@ -42,7 +42,7 @@ class Chef
42
42
  file.each_line do |line|
43
43
  if line.match(search)
44
44
  temp_file.puts replace
45
- Chef::Log.info " ++ #{path}"
45
+ puts "INFO: ++ #{path}"
46
46
  else
47
47
  temp_file.puts line
48
48
  end
@@ -61,7 +61,7 @@ class Chef
61
61
  load_data
62
62
  @data.keys.each do |entry|
63
63
  @data[entry].keys.each do |glob|
64
- Chef::Log.info "Running substitutions for #{entry} -> #{glob}"
64
+ puts "INFO: Running substitutions for #{entry} -> #{glob}"
65
65
  Dir[::File.join(@backup_path, glob)].each do |file|
66
66
  @data[entry][glob].each do |substitution|
67
67
  search = Regexp.new(substitution['pattern'])
@@ -1,4 +1,4 @@
1
1
  module KnifeTidy
2
- VERSION = '0.2.4'
2
+ VERSION = '0.3.0'
3
3
  MAJOR, MINOR, TINY = VERSION.split('.')
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-tidy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Miller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-12 00:00:00.000000000 Z
11
+ date: 2017-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake