knife-topo 2.0.3 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 19485c4efce675847ae4dde4ed7c045e48cdfd7b
4
- data.tar.gz: bf7721eda5687896c64f3327a06959aceb9c6109
3
+ metadata.gz: 7d2b424d953de3fe9fe46d76562b29bdfc08b27d
4
+ data.tar.gz: 1f4c0b21f7dbf6b285b159486f4b38c63be7fd21
5
5
  SHA512:
6
- metadata.gz: 633d4163ea5de35ddd8d80ef4447c7f5c97d80804169da9f7e6f82d929440abf7cabf2301ce27ff6940c1195dbf5f356e5a63e386b9cd0f83c7dcf5f276d8b4f
7
- data.tar.gz: 2b68f502d8591d89f0fc5186532730362f03dc467925089e2687e4b176af45f88e80bdfa62a1713805a5e562aa11e0ad460dbcd9857c05fc5e456f372e60eb53
6
+ metadata.gz: 12e20c73920d5db8e0a30a3e72f3b7ca31980c7d1092655d8bea5b5868726fa86dc205f25ad31f4e84e8a8b6667e660ca8ffe5b8612c41a919c8ab004e7f9b80
7
+ data.tar.gz: 3e55e3ac7a10033755fd72d1c9c593dcbd995523ee0db6aa3e03d4d4939f0ea5b9d36d5ec40e2554585a6eb2d49ddace61d5c70426bb077cc0e9dc6cce0eae2e
@@ -15,6 +15,6 @@ Gem::Specification.new do |spec|
15
15
  spec.license = 'Apache License (2.0)'
16
16
 
17
17
  spec.files = Dir.glob('{lib}/**/*') +
18
- ['LICENSE', 'README.md', __FILE__]
18
+ ['LICENSE', 'README.md', __FILE__]
19
19
  spec.require_paths = ['lib']
20
20
  end
@@ -62,7 +62,7 @@ module KnifeTopo
62
62
  end
63
63
 
64
64
  def most_common(vals)
65
- return if vals.length == 0
65
+ return if vals.empty?
66
66
  vals.group_by do |val|
67
67
  val
68
68
  end.values.max_by(&:size).first
@@ -1,4 +1,4 @@
1
1
  # constants
2
2
  module KnifeTopo
3
- PRIORITIES = %w(default force_default normal override force_override)
3
+ PRIORITIES = %w(default force_default normal override force_override).freeze
4
4
  end
@@ -110,6 +110,7 @@ module KnifeTopo
110
110
  Chef::DataBag.load(topo_bag_name)
111
111
  rescue Net::HTTPServerException => e
112
112
  raise unless e.to_s =~ /^404/
113
+ {}
113
114
  end
114
115
 
115
116
  def load_node_data(node_name, min_priority = 'default')
@@ -25,7 +25,7 @@ module KnifeTopo
25
25
  # Node update helper for knife topo
26
26
  module NodeUpdateHelper
27
27
  # Update an existing node
28
- def update_node(node_updates)
28
+ def update_node(node_updates, merge = false)
29
29
  config[:disable_editing] = true
30
30
 
31
31
  begin
@@ -34,7 +34,7 @@ module KnifeTopo
34
34
 
35
35
  env = node_updates['chef_environment']
36
36
  check_chef_env(env) unless env == node['chef_environment']
37
- do_node_updates(node, node_updates)
37
+ do_node_updates(node, node_updates, merge)
38
38
 
39
39
  rescue Net::HTTPServerException => e
40
40
  raise unless e.to_s =~ /^404/
@@ -44,8 +44,8 @@ module KnifeTopo
44
44
  node
45
45
  end
46
46
 
47
- def do_node_updates(node, node_updates)
48
- updated = update_node_with_values(node, node_updates)
47
+ def do_node_updates(node, node_updates, merge = false)
48
+ updated = update_node_with_values(node, node_updates, merge)
49
49
  if updated
50
50
  ui.info "Updating #{updated.join(', ')} on node #{node.name}"
51
51
  node.save
@@ -56,11 +56,11 @@ module KnifeTopo
56
56
  end
57
57
 
58
58
  # Update original node, return list of updated properties.
59
- def update_node_with_values(node, updates)
59
+ def update_node_with_values(node, updates, merge = false)
60
60
  updated = []
61
61
 
62
62
  # merge the normal attributes (but not tags)
63
- updated << 'normal' if update_attrs(node, updates['normal'])
63
+ updated << 'normal' if update_attrs(node, updates['normal'], merge)
64
64
 
65
65
  # update runlist
66
66
  updated << 'run_list' if update_runlist(node, updates['run_list'])
@@ -74,15 +74,20 @@ module KnifeTopo
74
74
  updated << 'tags' if update_tags(node, updates['tags'])
75
75
 
76
76
  # return false if no updates, else return array of property names
77
- updated.length > 0 && updated
77
+ !updated.empty? && updated
78
78
  end
79
79
 
80
80
  # Update methods all return true if an actual update is made
81
- def update_attrs(node, attrs)
81
+ def update_attrs(node, attrs, merge = false)
82
82
  return false unless attrs
83
- attrs.delete('tags')
83
+ # keep the current tags
84
+ attrs['tags'] = node.normal.tags
84
85
  original = Marshal.load(Marshal.dump(node.normal))
85
- node.normal = Chef::Mixin::DeepMerge.merge(node.normal, attrs)
86
+ node.normal = if merge
87
+ Chef::Mixin::DeepMerge.merge(node.normal, attrs)
88
+ else
89
+ attrs
90
+ end
86
91
  original != node.normal
87
92
  end
88
93
 
@@ -1,4 +1,4 @@
1
1
  # version
2
2
  module KnifeTopo
3
- VERSION = '2.0.3'
3
+ VERSION = '2.0.4'.freeze
4
4
  end
@@ -47,7 +47,7 @@ module KnifeTopo
47
47
  )
48
48
 
49
49
  # Make the base bootstrap options available on topo bootstrap
50
- self.options = (Chef::Knife::Bootstrap.options).merge(TopoBootstrap.options)
50
+ self.options = Chef::Knife::Bootstrap.options.merge(TopoBootstrap.options)
51
51
 
52
52
  attr_accessor :msgs, :results
53
53
 
@@ -120,21 +120,21 @@ module KnifeTopo
120
120
 
121
121
  # Report is used by create, update and bootstrap commands
122
122
  def report
123
- if @topo['nodes'].length > 0
123
+ if @topo['nodes'].empty?
124
+ ui.info 'No nodes found'
125
+ else
124
126
  report_msg(:bootstrapped, :info, false) if @bootstrap
125
127
  report_msg(:skipped, :info, true)
126
128
  report_msg(:skipped_ssh, :info, true)
127
129
  report_msg(:existed, :info, true)
128
130
  report_msg(:failed, :warn, true) if @bootstrap
129
- else
130
- ui.info 'No nodes found'
131
131
  end
132
132
  ui.info("Topology: #{@topo.display_info}")
133
133
  end
134
134
 
135
135
  def report_msg(state, level, only_non_zero = true)
136
136
  nodes = @results[state]
137
- return if only_non_zero && nodes.length == 0
137
+ return if only_non_zero && nodes.empty?
138
138
  ui.send(level, @msgs[state] %
139
139
  { num: nodes.length, list: nodes.join(', ') })
140
140
  end
@@ -43,7 +43,7 @@ module KnifeTopo
43
43
 
44
44
  def initialize(args)
45
45
  super
46
- @args = args
46
+ @args = args
47
47
  end
48
48
 
49
49
  def run
@@ -37,14 +37,14 @@ module KnifeTopo
37
37
  )
38
38
 
39
39
  # Make called command options available
40
- self.options = (Chef::Knife::CookbookUpload.options).merge(
40
+ self.options = Chef::Knife::CookbookUpload.options.merge(
41
41
  TopoCookbookUpload.options)
42
42
 
43
43
  include KnifeTopo::Loader
44
44
 
45
45
  def initialize(args)
46
46
  super
47
- @args = args
47
+ @args = args
48
48
 
49
49
  # All called commands need to accept union of options
50
50
  Chef::Knife::CookbookUpload.options = options
@@ -50,7 +50,7 @@ module KnifeTopo
50
50
  # Make called command options available
51
51
  orig_opts = KnifeTopo::TopoCreate.options
52
52
  upload_opts = Chef::Knife::CookbookUpload.options
53
- merged_opts = (KnifeTopo::TopoBootstrap.options).merge(upload_opts)
53
+ merged_opts = KnifeTopo::TopoBootstrap.options.merge(upload_opts)
54
54
  self.options = merged_opts.merge(orig_opts)
55
55
 
56
56
  include KnifeTopo::CommandHelper
@@ -59,7 +59,7 @@ module KnifeTopo
59
59
 
60
60
  def initialize(args)
61
61
  super
62
- @args = args
62
+ @args = args
63
63
  end
64
64
 
65
65
  def bootstrap_msgs
@@ -116,8 +116,9 @@ module KnifeTopo
116
116
 
117
117
  def update_nodes
118
118
  nodes = processor.generate_nodes
119
+ merge = @topo.merge_attrs
119
120
  nodes.each do |node_data|
120
- bootstrap_or_update_node(node_data)
121
+ bootstrap_or_update_node(node_data, merge)
121
122
  end
122
123
  end
123
124
 
@@ -130,16 +131,14 @@ module KnifeTopo
130
131
  @topo.save
131
132
  end
132
133
 
133
- def bootstrap_or_update_node(node_data)
134
+ def bootstrap_or_update_node(node_data, merge)
134
135
  node_name = node_data['name']
135
136
  if @bootstrap
136
- update_node(node_data) unless node_bootstrap(node_data)
137
+ update_node(node_data, merge) unless node_bootstrap(node_data)
138
+ elsif update_node(node_data, merge)
139
+ @results[:existed] << node_name
137
140
  else
138
- if update_node(node_data)
139
- @results[:existed] << node_name
140
- else
141
- @results[:skipped] << node_name
142
- end
141
+ @results[:skipped] << node_name
143
142
  end
144
143
  end
145
144
 
@@ -82,7 +82,7 @@ module KnifeTopo
82
82
  update_nodes!(topo['nodes'])
83
83
 
84
84
  # pick an topo environment based on the nodes
85
- return topo if @node_names.length == 0
85
+ return topo if @node_names.empty?
86
86
  env = pick_env(topo['nodes'])
87
87
  topo['chef_environment'] = env if env
88
88
  topo
@@ -105,13 +105,13 @@ module KnifeTopo
105
105
  'tags' => [],
106
106
  'strategy' => 'via_cookbook',
107
107
  'strategy_data' => default_strategy_data,
108
- 'nodes' => @node_names.length == 0 ? [empty_node('node1')] : []
108
+ 'nodes' => @node_names.empty? ? [empty_node('node1')] : []
109
109
  }
110
110
  end
111
111
 
112
112
  def default_strategy_data
113
113
  {
114
- 'cookbook' => @topo_name || 'topo1',
114
+ 'cookbook' => @topo_name || 'topo1',
115
115
  'filename' => 'topology'
116
116
  }
117
117
  end
@@ -41,7 +41,7 @@ module KnifeTopo
41
41
 
42
42
  # Make the base search options available on topo search
43
43
  orig_opts = KnifeTopo::TopoSearch.options
44
- self.options = (Chef::Knife::Search.options).merge(orig_opts)
44
+ self.options = Chef::Knife::Search.options.merge(orig_opts)
45
45
 
46
46
  include KnifeTopo::CommandHelper
47
47
 
@@ -75,7 +75,7 @@ module KnifeTopo
75
75
  group_query = query && !query.start_with?('NOT') ? "(#{query})" : query
76
76
 
77
77
  # search specific topologies or all/none
78
- constraint = (topo_name) ? 'topo_name:' + topo_name : 'topo_name:*'
78
+ constraint = topo_name ? 'topo_name:' + topo_name : 'topo_name:*'
79
79
 
80
80
  # combine the grouped query and constraint
81
81
  combine(query, group_query, constraint)
@@ -26,7 +26,9 @@ class Chef
26
26
  module Topo
27
27
  # Convert V1 topology JSON to V2
28
28
  class TopoV1Converter < Chef::Topo::Converter
29
- PRIORITIES = %w(default force_default normal override force_override)
29
+ PRIORITIES = %w(
30
+ default force_default normal override force_override
31
+ ).freeze
30
32
 
31
33
  register_converter('topo_v1', name)
32
34
 
@@ -51,7 +53,7 @@ class Chef
51
53
  def determine_strategy
52
54
  @output['strategy'] = 'direct_to_node'
53
55
  cookbooks = @input['cookbook_attributes']
54
- return unless cookbooks && cookbooks.length > 0
56
+ return unless cookbooks && !cookbooks.empty?
55
57
 
56
58
  cookbooks.each do |cb|
57
59
  cond = cb['conditional'] || []
@@ -25,7 +25,9 @@ class Chef
25
25
  class Topology < Chef::DataBagItem
26
26
  attr_accessor :strategy
27
27
 
28
- PRIORITIES = %w(default force_default normal override force_override)
28
+ PRIORITIES = %w(
29
+ default force_default normal override force_override
30
+ ).freeze
29
31
 
30
32
  # Have to override and say this is a data bag json_class
31
33
  # or get error on upload re 'must specify id'
@@ -41,7 +43,7 @@ class Chef
41
43
  end
42
44
 
43
45
  def self.convert_from(format, data)
44
- from_json((Chef::Topo::Converter.convert(format, data)))
46
+ from_json(Chef::Topo::Converter.convert(format, data))
45
47
  end
46
48
 
47
49
  def self.from_json(data)
@@ -52,10 +54,11 @@ class Chef
52
54
 
53
55
  # Make sure the JSON has an id and other expected fields
54
56
  def raw_data=(new_data)
57
+ @strategy = new_data['strategy'] || 'direct_to_node'
55
58
  new_data['id'] ||= (new_data['name'] || 'undefined')
59
+ # new_data['name'] ||= (new_data['id'])
56
60
  new_data['nodes'] ||= []
57
61
  super(normalize(new_data))
58
- @strategy = raw_data['strategy'] || 'direct_to_node'
59
62
  end
60
63
 
61
64
  # clean up some variations so we only have to process one way
@@ -100,6 +103,10 @@ class Chef
100
103
  raw_data['nodes']
101
104
  end
102
105
 
106
+ def merge_attrs
107
+ raw_data['strategy_data'] && raw_data['strategy_data']['merge_attrs']
108
+ end
109
+
103
110
  # nodes with topo properties merged in
104
111
  def merged_nodes
105
112
  nodes.map do |n|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-topo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christine Draper
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-21 00:00:00.000000000 Z
11
+ date: 2016-03-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Knife-topo uses a JSON file to capture a topology of nodes, which can
14
14
  be loaded into Chef and bootstrapped
@@ -63,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
63
  version: '0'
64
64
  requirements: []
65
65
  rubyforge_project:
66
- rubygems_version: 2.4.8
66
+ rubygems_version: 2.5.2
67
67
  signing_key:
68
68
  specification_version: 4
69
69
  summary: Knife plugin to manage topologies of nodes