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