| Class | BoxGrinder::ApplianceConfigHelper |
| In: |
lib/boxgrinder-core/helpers/appliance-config-helper.rb
lib/boxgrinder-core/helpers/appliance-config-helper.rb |
| Parent: | Object |
| VAR_SUBSTITUTION_MAX_DEPTH | = | 20 |
| VAR_SUBSTITUTION_MAX_DEPTH | = | 20 |
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 27
27: def initialize(appliance_configs)
28: @appliance_configs = appliance_configs.reverse
29: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 27
27: def initialize(appliance_configs)
28: @appliance_configs = appliance_configs.reverse
29: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 31
31: def merge(appliance_config)
32: @appliance_config = appliance_config
33:
34: prepare_os
35: prepare_appliances
36:
37: merge_variables
38: merge_hardware
39: merge_repos
40: merge_default_repos
41: merge_packages
42: merge_files
43: merge_post_operations
44: substitute_variables
45:
46: @appliance_config
47: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 31
31: def merge(appliance_config)
32: @appliance_config = appliance_config
33:
34: prepare_os
35: prepare_appliances
36:
37: merge_variables
38: merge_hardware
39: merge_repos
40: merge_default_repos
41: merge_packages
42: merge_files
43: merge_post_operations
44: substitute_variables
45:
46: @appliance_config
47: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 129
129: def merge_cpus
130: merge_field('hardware.cpus') { |cpus| @appliance_config.hardware.cpus = cpus if cpus > @appliance_config.hardware.cpus }
131: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 129
129: def merge_cpus
130: merge_field('hardware.cpus') { |cpus| @appliance_config.hardware.cpus = cpus if cpus > @appliance_config.hardware.cpus }
131: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 49
49: def merge_default_repos
50: @appliance_config.default_repos = true
51:
52: @appliance_configs.each do |appliance_config|
53: if appliance_config.default_repos == false
54: @appliance_config.default_repos = false
55: break
56: end
57: end
58: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 49
49: def merge_default_repos
50: @appliance_config.default_repos = true
51:
52: @appliance_configs.each do |appliance_config|
53: if appliance_config.default_repos == false
54: @appliance_config.default_repos = false
55: break
56: end
57: end
58: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 243
243: def merge_field(field, force = false)
244: @appliance_configs.each do |appliance_config|
245: value = eval("appliance_config.#{field}")
246: next if value.nil? and !force
247: yield value
248: end
249: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 243
243: def merge_field(field, force = false)
244: @appliance_configs.each do |appliance_config|
245: value = eval("appliance_config.#{field}")
246: next if value.nil? and !force
247: yield value
248: end
249: end
issues.jboss.org/browse/BGBUILD-276
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 213
213: def merge_files
214: @appliance_config.files.each_value { |dirs| dirs.clear }
215:
216: included = []
217:
218: @appliance_configs.each do |appliance_config|
219: next if included.include?(appliance_config)
220: appliance_config.files.each do |dir, files|
221: @appliance_config.files[dir] = [] if @appliance_config.files[dir].nil?
222: files.each { |f| @appliance_config.files[dir] << f }
223: end
224: included << appliance_config
225: end
226: end
issues.jboss.org/browse/BGBUILD-276
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 213
213: def merge_files
214: @appliance_config.files.each_value { |dirs| dirs.clear }
215:
216: included = []
217:
218: @appliance_configs.each do |appliance_config|
219: next if included.include?(appliance_config)
220: appliance_config.files.each do |dir, files|
221: @appliance_config.files[dir] = [] if @appliance_config.files[dir].nil?
222: files.each { |f| @appliance_config.files[dir] << f }
223: end
224: included << appliance_config
225: end
226: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 123
123: def merge_hardware
124: merge_cpus
125: merge_partitions
126: merge_memory
127: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 123
123: def merge_hardware
124: merge_cpus
125: merge_partitions
126: merge_memory
127: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 170
170: def merge_memory
171: merge_field('hardware.memory') { |memory| @appliance_config.hardware.memory = memory if memory > @appliance_config.hardware.memory }
172: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 170
170: def merge_memory
171: merge_field('hardware.memory') { |memory| @appliance_config.hardware.memory = memory if memory > @appliance_config.hardware.memory }
172: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 201
201: def merge_packages
202: @appliance_config.packages.clear
203:
204: @appliance_configs.each do |appliance_config|
205: appliance_config.packages.each do |package|
206: @appliance_config.packages << package
207: end
208: end
209: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 201
201: def merge_packages
202: @appliance_config.packages.clear
203:
204: @appliance_configs.each do |appliance_config|
205: appliance_config.packages.each do |package|
206: @appliance_config.packages << package
207: end
208: end
209: end
This will merge partitions from multiple appliances.
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 134
134: def merge_partitions
135: partitions = {}
136:
137: merge_field('hardware.partitions') do |parts|
138: parts.each do |root, partition|
139: if partitions.keys.include?(root)
140: partitions[root]['size'] = partition['size'] if partitions[root]['size'] < partition['size']
141:
142: unless partition['type'].nil?
143: partitions[root].delete('options') if partitions[root]['type'] != partition['type']
144: partitions[root]['type'] = partition['type']
145: else
146: partitions[root]['type'] = @appliance_config.default_filesystem_type
147: end
148: else
149: partitions[root] = {}
150: partitions[root]['size'] = partition['size']
151:
152: unless partition['type'].nil?
153: partitions[root]['type'] = partition['type']
154: else
155: partitions[root]['type'] = @appliance_config.default_filesystem_type
156: end
157: end
158:
159: partitions[root]['passphrase'] = partition['passphrase'] unless partition['passphrase'].nil?
160: partitions[root]['options'] = partition['options'] unless partition['options'].nil?
161: end
162: end
163:
164: # https://bugzilla.redhat.com/show_bug.cgi?id=466275
165: partitions['/boot'] = {'type' => 'ext3', 'size' => 0.1} if partitions['/boot'].nil? and (@appliance_config.os.name == 'sl' or @appliance_config.os.name == 'centos' or @appliance_config.os.name == 'rhel') and @appliance_config.os.version == '5'
166:
167: @appliance_config.hardware.partitions = partitions
168: end
This will merge partitions from multiple appliances.
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 134
134: def merge_partitions
135: partitions = {}
136:
137: merge_field('hardware.partitions') do |parts|
138: parts.each do |root, partition|
139: if partitions.keys.include?(root)
140: partitions[root]['size'] = partition['size'] if partitions[root]['size'] < partition['size']
141:
142: unless partition['type'].nil?
143: partitions[root].delete('options') if partitions[root]['type'] != partition['type']
144: partitions[root]['type'] = partition['type']
145: else
146: partitions[root]['type'] = @appliance_config.default_filesystem_type
147: end
148: else
149: partitions[root] = {}
150: partitions[root]['size'] = partition['size']
151:
152: unless partition['type'].nil?
153: partitions[root]['type'] = partition['type']
154: else
155: partitions[root]['type'] = @appliance_config.default_filesystem_type
156: end
157: end
158:
159: partitions[root]['passphrase'] = partition['passphrase'] unless partition['passphrase'].nil?
160: partitions[root]['options'] = partition['options'] unless partition['options'].nil?
161: end
162: end
163:
164: # https://bugzilla.redhat.com/show_bug.cgi?id=466275
165: partitions['/boot'] = {'type' => 'ext3', 'size' => 0.1} if partitions['/boot'].nil? and (@appliance_config.os.name == 'sl' or @appliance_config.os.name == 'centos' or @appliance_config.os.name == 'rhel') and @appliance_config.os.version == '5'
166:
167: @appliance_config.hardware.partitions = partitions
168: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 228
228: def merge_post_operations
229: @appliance_config.post.each_value { |cmds| cmds.clear }
230:
231: included = []
232:
233: @appliance_configs.each do |appliance_config|
234: next if included.include?(appliance_config)
235: appliance_config.post.each do |platform, cmds|
236: @appliance_config.post[platform] = [] if @appliance_config.post[platform].nil?
237: cmds.each { |cmd| @appliance_config.post[platform] << cmd }
238: end
239: included << appliance_config
240: end
241: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 228
228: def merge_post_operations
229: @appliance_config.post.each_value { |cmds| cmds.clear }
230:
231: included = []
232:
233: @appliance_configs.each do |appliance_config|
234: next if included.include?(appliance_config)
235: appliance_config.post.each do |platform, cmds|
236: @appliance_config.post[platform] = [] if @appliance_config.post[platform].nil?
237: cmds.each { |cmd| @appliance_config.post[platform] << cmd }
238: end
239: included << appliance_config
240: end
241: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 191
191: def merge_repos
192: @appliance_config.repos.clear
193:
194: @appliance_configs.each do |appliance_config|
195: appliance_config.repos.each do |repo|
196: @appliance_config.repos << repo
197: end
198: end
199: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 191
191: def merge_repos
192: @appliance_config.repos.clear
193:
194: @appliance_configs.each do |appliance_config|
195: appliance_config.repos.each do |repo|
196: @appliance_config.repos << repo
197: end
198: end
199: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 60
60: def merge_variables
61: @appliance_config.variables = {} if @appliance_config.variables.nil?
62: @appliance_configs.each do |appliance_config|
63: appliance_config.variables.each do |var, val|
64: @appliance_config.variables[var] = val
65: end
66: end
67:
68: @appliance_config.variables["OS_NAME"] = @appliance_config.os.name
69: @appliance_config.variables["OS_VERSION"] = @appliance_config.os.version
70: @appliance_config.variables["ARCH"] = @appliance_config.hardware.arch
71: @appliance_config.variables["BASE_ARCH"] = @appliance_config.hardware.base_arch
72:
73: resolve
74: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 60
60: def merge_variables
61: @appliance_config.variables = {} if @appliance_config.variables.nil?
62: @appliance_configs.each do |appliance_config|
63: appliance_config.variables.each do |var, val|
64: @appliance_config.variables[var] = val
65: end
66: end
67:
68: @appliance_config.variables["OS_NAME"] = @appliance_config.os.name
69: @appliance_config.variables["OS_VERSION"] = @appliance_config.os.version
70: @appliance_config.variables["ARCH"] = @appliance_config.hardware.arch
71: @appliance_config.variables["BASE_ARCH"] = @appliance_config.hardware.base_arch
72:
73: resolve
74: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 183
183: def prepare_appliances
184: @appliance_config.appliances.clear
185:
186: @appliance_configs.each do |appliance_config|
187: @appliance_config.appliances << appliance_config.name unless appliance_config.name == @appliance_config.name
188: end
189: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 183
183: def prepare_appliances
184: @appliance_config.appliances.clear
185:
186: @appliance_configs.each do |appliance_config|
187: @appliance_config.appliances << appliance_config.name unless appliance_config.name == @appliance_config.name
188: end
189: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 174
174: def prepare_os
175: merge_field('os.name') { |name| @appliance_config.os.name = name.to_s }
176: merge_field('os.version') { |version| @appliance_config.os.version = version.to_s }
177: merge_field('os.password') { |password| @appliance_config.os.password = password.to_s }
178: merge_field('os.pae') { |pae| @appliance_config.os.pae = false unless pae }
179:
180: @appliance_config.os.password = 'boxgrinder' if @appliance_config.os.password.nil?
181: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 174
174: def prepare_os
175: merge_field('os.name') { |name| @appliance_config.os.name = name.to_s }
176: merge_field('os.version') { |version| @appliance_config.os.version = version.to_s }
177: merge_field('os.password') { |password| @appliance_config.os.password = password.to_s }
178: merge_field('os.pae') { |pae| @appliance_config.os.pae = false unless pae }
179:
180: @appliance_config.os.password = 'boxgrinder' if @appliance_config.os.password.nil?
181: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 76
76: def resolve(resolve_stack = nil, resolved_set = Set.new())
77: if resolve_stack.nil?
78: @appliance_config.variables.keys.each { |var| resolve([var], resolved_set) }
79: else
80: var = resolve_stack.last
81: refs = @appliance_config.variables.keys.delete_if { |k|
82: @appliance_config.variables[k].nil? ||
83: @appliance_config.variables[k].index("##{k}#").nil? ||
84: resolve_stack.index(k).nil?
85: }
86: refs.each do |ref|
87: resolve(Array.new(resolve_stack).push(ref), resolved_set) unless resolved_set.include?(ref)
88: while @appliance_config.variables[var].include? "##{ref}#" do
89: @appliance_config.variables[var].gsub!("##{ref}#", @appliance_config.variables[ref])
90: end
91: end
92: resolved_set << var
93: end
94: end
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 76
76: def resolve(resolve_stack = nil, resolved_set = Set.new())
77: if resolve_stack.nil?
78: @appliance_config.variables.keys.each { |var| resolve([var], resolved_set) }
79: else
80: var = resolve_stack.last
81: refs = @appliance_config.variables.keys.delete_if { |k|
82: @appliance_config.variables[k].nil? ||
83: @appliance_config.variables[k].index("##{k}#").nil? ||
84: resolve_stack.index(k).nil?
85: }
86: refs.each do |ref|
87: resolve(Array.new(resolve_stack).push(ref), resolved_set) unless resolved_set.include?(ref)
88: while @appliance_config.variables[var].include? "##{ref}#" do
89: @appliance_config.variables[var].gsub!("##{ref}#", @appliance_config.variables[ref])
90: end
91: end
92: resolved_set << var
93: end
94: end
Replace variables with values. This will occur recursively upto a limited depth if the resolved values themselves contain variables.
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 106
106: def substitute(init, value, depth)
107: if depth > VAR_SUBSTITUTION_MAX_DEPTH
108: raise SystemStackError, "Maximal recursive depth (#{VAR_SUBSTITUTION_MAX_DEPTH})
109: reached for resolving variable #{init}, reached #{value} before stopping."
110: end
111: original = value.clone
112: value.gsub!(/(#(.*?)#)+?/) do
113: # 1. Match pre-defined variable, or variable defined in appliance definition.
114: next @appliance_config.variables[$2] if @appliance_config.variables.has_key?($2)
115: # 2. Match from environment variables.
116: next ENV[$2] unless ENV[$2].nil?
117: # 3. No match, replace the original string.
118: $1
119: end
120: substitute(init, value, depth+1) unless original == value
121: end
Replace variables with values. This will occur recursively upto a limited depth if the resolved values themselves contain variables.
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 106
106: def substitute(init, value, depth)
107: if depth > VAR_SUBSTITUTION_MAX_DEPTH
108: raise SystemStackError, "Maximal recursive depth (#{VAR_SUBSTITUTION_MAX_DEPTH})
109: reached for resolving variable #{init}, reached #{value} before stopping."
110: end
111: original = value.clone
112: value.gsub!(/(#(.*?)#)+?/) do
113: # 1. Match pre-defined variable, or variable defined in appliance definition.
114: next @appliance_config.variables[$2] if @appliance_config.variables.has_key?($2)
115: # 2. Match from environment variables.
116: next ENV[$2] unless ENV[$2].nil?
117: # 3. No match, replace the original string.
118: $1
119: end
120: substitute(init, value, depth+1) unless original == value
121: end
Get all leaf text values in the appliance definition, then substitute any variable values.
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 98
98: def substitute_variables
99: @appliance_config.all_values.each do |value|
100: substitute(value.clone, value, 0)
101: end
102: end
Get all leaf text values in the appliance definition, then substitute any variable values.
# File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 98
98: def substitute_variables
99: @appliance_config.all_values.each do |value|
100: substitute(value.clone, value, 0)
101: end
102: end