Class BoxGrinder::ApplianceConfigHelper
In: lib/boxgrinder-core/helpers/appliance-config-helper.rb
lib/boxgrinder-core/helpers/appliance-config-helper.rb
Parent: Object

Methods

Constants

VAR_SUBSTITUTION_MAX_DEPTH = 20
VAR_SUBSTITUTION_MAX_DEPTH = 20

Public Class methods

[Source]

    # File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 27
27:     def initialize(appliance_configs)
28:       @appliance_configs = appliance_configs.reverse
29:     end

[Source]

    # File lib/boxgrinder-core/helpers/appliance-config-helper.rb, line 27
27:     def initialize(appliance_configs)
28:       @appliance_configs = appliance_configs.reverse
29:     end

Public Instance methods

[Source]

    # 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

[Source]

    # 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

[Source]

     # 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

[Source]

     # 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

[Source]

    # 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

[Source]

    # 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

[Source]

     # 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

[Source]

     # 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
BGBUILD-276
Import files into appliance via appliance definition file (Files section)

issues.jboss.org/browse/BGBUILD-276

[Source]

     # 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
BGBUILD-276
Import files into appliance via appliance definition file (Files section)

issues.jboss.org/browse/BGBUILD-276

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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.

[Source]

     # 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.

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

    # 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

[Source]

    # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

    # 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

[Source]

    # 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.

[Source]

     # 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.

[Source]

     # 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.

[Source]

     # 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.

[Source]

     # 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

[Validate]