Class: Chef::Topo::TopoV1Converter

Inherits:
Converter
  • Object
show all
Defined in:
lib/chef/topo/converter/topo_v1.rb

Overview

Convert V1 topology JSON to V2

Constant Summary collapse

PRIORITIES =
%w(default force_default normal override force_override)

Instance Attribute Summary

Attributes inherited from Converter

#input

Instance Method Summary collapse

Methods inherited from Converter

convert, converter, #initialize, load_converter, register_converter

Constructor Details

This class inherits a constructor from Chef::Topo::Converter

Instance Method Details

#cleanup_outputObject



117
118
119
120
# File 'lib/chef/topo/converter/topo_v1.rb', line 117

def cleanup_output
  @output.delete('cookbook_attributes')
  @output
end

#convert(data = nil) ⇒ Object



33
34
35
36
37
38
39
40
41
42
# File 'lib/chef/topo/converter/topo_v1.rb', line 33

def convert(data = nil)
  @input = data if data
  @output = @input.dup
  determine_strategy
  @output['nodes'] = []
  @input['nodes'].each do |n|
    @output['nodes'] << convert_node(n)
  end
  cleanup_output
end

#convert_node(n) ⇒ Object



44
45
46
47
48
49
# File 'lib/chef/topo/converter/topo_v1.rb', line 44

def convert_node(n)
  combined = merge_cookbook_attrs(n)
  type = node_type(n)
  combined['node_type'] ||= type if type
  combined
end

#determine_strategyObject



51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/chef/topo/converter/topo_v1.rb', line 51

def determine_strategy
  @output['strategy'] = 'direct_to_node'
  cookbooks = @input['cookbook_attributes']
  return unless cookbooks && cookbooks.length > 0

  cookbooks.each do |cb|
    cond = cb['conditional'] || []
    next unless !cond.empty? || PRIORITIES.any? { |k| cb.key?(k) }
    via_cookbook_strategy(cb)
    break
  end
end

#merge_cookbook_attrs(node) ⇒ Object

Combine cookbook attributes into node



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/chef/topo/converter/topo_v1.rb', line 82

def merge_cookbook_attrs(node)
  cb_attr_array = @input['cookbook_attributes']
  combined = node.dup
  return combined unless cb_attr_array

  # merge unqualified attributes into node
  cb_attr_array.each do |cb_attrs|
    merge_copy(combined, cb_attrs)

    # find qualified attributes for node
    cond = cb_attrs['conditional']
    next unless cond

    merge_copy_cond_attrs(combined, cond)
  end

  combined
end

#merge_copy(dest, source) ⇒ Object

move source contents and merge into dest



73
74
75
76
77
78
79
# File 'lib/chef/topo/converter/topo_v1.rb', line 73

def merge_copy(dest, source)
  PRIORITIES.each do |p|
    if source.key?(p)
      dest[p] = Chef::Mixin::DeepMerge.merge(dest[p], source[p])
    end
  end
end

#merge_copy_cond_attrs(combined, cond) ⇒ Object



101
102
103
104
105
106
107
108
109
# File 'lib/chef/topo/converter/topo_v1.rb', line 101

def merge_copy_cond_attrs(combined, cond)
  topo = (combined['normal'] || {})['topo'] || {}
  cond.each do |cond_attrs|
    if topo[cond_attrs['qualifier']] == cond_attrs['value']
      merge_copy(combined, cond_attrs)
    end
  end
  combined
end

#node_type(node) ⇒ Object



111
112
113
114
115
# File 'lib/chef/topo/converter/topo_v1.rb', line 111

def node_type(node)
  return node['node_type'] if node['node_type']
  return nil unless node['normal'] && node['normal']['topo']
  node['normal']['topo']['node_type']
end

#via_cookbook_strategy(cb) ⇒ Object



64
65
66
67
68
69
70
# File 'lib/chef/topo/converter/topo_v1.rb', line 64

def via_cookbook_strategy(cb)
  @output['strategy'] = 'via_cookbook'
  @output['strategy_data'] = {
    'cookbook' => cb['cookbook'] || @output['name'],
    'filename' => cb['filename'] || 'attributes'
  }
end