Class | BoxGrinder::Appliance |
In: |
lib/boxgrinder-build/appliance.rb
lib/boxgrinder-build/appliance.rb |
Parent: | Object |
appliance_config | [R] | |
appliance_config | [R] | |
plugin_chain | [R] | |
plugin_chain | [R] |
# File lib/boxgrinder-build/appliance.rb, line 34 34: def initialize(appliance_definition, config = Config.new, options = {}) 35: @appliance_definition = appliance_definition 36: @config = config 37: @log = options[:log] || LogHelper.new(:level => @config.log_level) 38: end
# File lib/boxgrinder-build/appliance.rb, line 34 34: def initialize(appliance_definition, config = Config.new, options = {}) 35: @appliance_definition = appliance_definition 36: @config = config 37: @log = options[:log] || LogHelper.new(:level => @config.log_level) 38: end
# File lib/boxgrinder-build/appliance.rb, line 108 108: def create 109: @log.debug "Launching new build..." 110: @log.trace "Used configuration: #{@config.to_yaml.gsub(/(\S*(key|account|cert|username|host|password)\S*).*:(.*)/, '\1' + ": <REDACTED>")}" 111: 112: # Let's load all plugins first 113: PluginHelper.new(@config, :log => @log).load_plugins 114: read_definition 115: validate_definition 116: initialize_plugins 117: 118: remove_old_builds if @config.force 119: 120: execute_plugin_chain 121: 122: self 123: end
# File lib/boxgrinder-build/appliance.rb, line 108 108: def create 109: @log.debug "Launching new build..." 110: @log.trace "Used configuration: #{@config.to_yaml.gsub(/(\S*(key|account|cert|username|host|password)\S*).*:(.*)/, '\1' + ": <REDACTED>")}" 111: 112: # Let's load all plugins first 113: PluginHelper.new(@config, :log => @log).load_plugins 114: read_definition 115: validate_definition 116: initialize_plugins 117: 118: remove_old_builds if @config.force 119: 120: execute_plugin_chain 121: 122: self 123: end
# File lib/boxgrinder-build/appliance.rb, line 129 129: def delivery_selected? 130: !(@config.delivery == :none or @config.delivery.to_s.empty? == nil) 131: end
# File lib/boxgrinder-build/appliance.rb, line 129 129: def delivery_selected? 130: !(@config.delivery == :none or @config.delivery.to_s.empty? == nil) 131: end
# File lib/boxgrinder-build/appliance.rb, line 133 133: def execute_plugin(plugin, param = nil) 134: if plugin.deliverables_exists? 135: @log.info "Deliverables for #{plugin.plugin_info[:name]} #{plugin.plugin_info[:type]} plugin exists, skipping." 136: return 137: end 138: 139: @log.debug "Executing #{plugin.plugin_info[:type]} plugin..." 140: 141: param.nil? ? plugin.run : plugin.run(param) 142: 143: @log.debug "#{plugin.plugin_info[:type].to_s.capitalize} plugin executed." 144: end
# File lib/boxgrinder-build/appliance.rb, line 133 133: def execute_plugin(plugin, param = nil) 134: if plugin.deliverables_exists? 135: @log.info "Deliverables for #{plugin.plugin_info[:name]} #{plugin.plugin_info[:type]} plugin exists, skipping." 136: return 137: end 138: 139: @log.debug "Executing #{plugin.plugin_info[:type]} plugin..." 140: 141: param.nil? ? plugin.run : plugin.run(param) 142: 143: @log.debug "#{plugin.plugin_info[:type].to_s.capitalize} plugin executed." 144: end
# File lib/boxgrinder-build/appliance.rb, line 103 103: def execute_plugin_chain 104: @log.info "Building '#{@appliance_config.name}' appliance for #{@appliance_config.hardware.arch} architecture." 105: @plugin_chain.each { |p| execute_plugin(p[:plugin], p[:param]) } 106: end
# File lib/boxgrinder-build/appliance.rb, line 103 103: def execute_plugin_chain 104: @log.info "Building '#{@appliance_config.name}' appliance for #{@appliance_config.hardware.arch} architecture." 105: @plugin_chain.each { |p| execute_plugin(p[:plugin], p[:param]) } 106: end
Here we initialize all required plugins and create a plugin chain. Initialization involves also plugin configuration validation for specified plugin type.
# File lib/boxgrinder-build/appliance.rb, line 74 74: def initialize_plugins 75: @plugin_chain = [] 76: 77: os_plugin, os_plugin_info = PluginManager.instance.initialize_plugin(:os, @appliance_config.os.name.to_sym) 78: os_plugin.init(@config, @appliance_config, os_plugin_info, :log => @log) 79: 80: @plugin_chain << {:plugin => os_plugin, :param => @appliance_definition} 81: 82: if platform_selected? 83: platform_plugin, platform_plugin_info = PluginManager.instance.initialize_plugin(:platform, @config.platform) 84: platform_plugin.init(@config, @appliance_config, platform_plugin_info, :log => @log, :previous_plugin => @plugin_chain.last[:plugin]) 85: 86: @plugin_chain << {:plugin => platform_plugin} 87: end 88: 89: if delivery_selected? 90: delivery_plugin, delivery_plugin_info = PluginManager.instance.initialize_plugin(:delivery, @config.delivery) 91: delivery_plugin.init(@config, @appliance_config, delivery_plugin_info, :log => @log, :previous_plugin => @plugin_chain.last[:plugin], :type => @config.delivery) 92: 93: @plugin_chain << {:plugin => delivery_plugin} 94: end 95: end
Here we initialize all required plugins and create a plugin chain. Initialization involves also plugin configuration validation for specified plugin type.
# File lib/boxgrinder-build/appliance.rb, line 74 74: def initialize_plugins 75: @plugin_chain = [] 76: 77: os_plugin, os_plugin_info = PluginManager.instance.initialize_plugin(:os, @appliance_config.os.name.to_sym) 78: os_plugin.init(@config, @appliance_config, os_plugin_info, :log => @log) 79: 80: @plugin_chain << {:plugin => os_plugin, :param => @appliance_definition} 81: 82: if platform_selected? 83: platform_plugin, platform_plugin_info = PluginManager.instance.initialize_plugin(:platform, @config.platform) 84: platform_plugin.init(@config, @appliance_config, platform_plugin_info, :log => @log, :previous_plugin => @plugin_chain.last[:plugin]) 85: 86: @plugin_chain << {:plugin => platform_plugin} 87: end 88: 89: if delivery_selected? 90: delivery_plugin, delivery_plugin_info = PluginManager.instance.initialize_plugin(:delivery, @config.delivery) 91: delivery_plugin.init(@config, @appliance_config, delivery_plugin_info, :log => @log, :previous_plugin => @plugin_chain.last[:plugin], :type => @config.delivery) 92: 93: @plugin_chain << {:plugin => delivery_plugin} 94: end 95: end
# File lib/boxgrinder-build/appliance.rb, line 125 125: def platform_selected? 126: !(@config.platform == :none or @config.platform.to_s.empty? == nil) 127: end
# File lib/boxgrinder-build/appliance.rb, line 125 125: def platform_selected? 126: !(@config.platform == :none or @config.platform.to_s.empty? == nil) 127: end
TODO: this is not very clean…
# File lib/boxgrinder-build/appliance.rb, line 41 41: def read_definition 42: # first try to read as appliance definition file 43: appliance_helper = ApplianceDefinitionHelper.new(:log => @log) 44: appliance_helper.read_definitions(@appliance_definition) 45: 46: appliance_configs = appliance_helper.appliance_configs 47: appliance_config = appliance_configs.first 48: 49: if appliance_config.nil? 50: # Still nothing? Then try to read OS plugin specific format... 51: PluginManager.instance.plugins[:os].each_value do |info| 52: plugin = info[:class].new 53: appliance_config = plugin.read_file(@appliance_definition) if plugin.respond_to?(:read_file) 54: break unless appliance_config.nil? 55: end 56: appliance_configs = [appliance_config] 57: 58: raise ValidationError, "Couldn't read appliance definition file: #{File.basename(@appliance_definition)}." if appliance_config.nil? 59: end 60: 61: appliance_config_helper = ApplianceConfigHelper.new(appliance_configs) 62: @appliance_config = appliance_config_helper.merge(appliance_config.clone.init_arch).initialize_paths 63: end
TODO: this is not very clean…
# File lib/boxgrinder-build/appliance.rb, line 41 41: def read_definition 42: # first try to read as appliance definition file 43: appliance_helper = ApplianceDefinitionHelper.new(:log => @log) 44: appliance_helper.read_definitions(@appliance_definition) 45: 46: appliance_configs = appliance_helper.appliance_configs 47: appliance_config = appliance_configs.first 48: 49: if appliance_config.nil? 50: # Still nothing? Then try to read OS plugin specific format... 51: PluginManager.instance.plugins[:os].each_value do |info| 52: plugin = info[:class].new 53: appliance_config = plugin.read_file(@appliance_definition) if plugin.respond_to?(:read_file) 54: break unless appliance_config.nil? 55: end 56: appliance_configs = [appliance_config] 57: 58: raise ValidationError, "Couldn't read appliance definition file: #{File.basename(@appliance_definition)}." if appliance_config.nil? 59: end 60: 61: appliance_config_helper = ApplianceConfigHelper.new(appliance_configs) 62: @appliance_config = appliance_config_helper.merge(appliance_config.clone.init_arch).initialize_paths 63: end
# File lib/boxgrinder-build/appliance.rb, line 97 97: def remove_old_builds 98: @log.info "Removing previous builds for #{@appliance_config.name} appliance..." 99: FileUtils.rm_rf(@appliance_config.path.build) 100: @log.debug "Previous builds removed." 101: end
# File lib/boxgrinder-build/appliance.rb, line 97 97: def remove_old_builds 98: @log.info "Removing previous builds for #{@appliance_config.name} appliance..." 99: FileUtils.rm_rf(@appliance_config.path.build) 100: @log.debug "Previous builds removed." 101: end
# File lib/boxgrinder-build/appliance.rb, line 65 65: def validate_definition 66: os_plugin = PluginManager.instance.plugins[:os][@appliance_config.os.name.to_sym] 67: 68: raise "Not supported operating system selected: #{@appliance_config.os.name}. Make sure you have installed right operating system plugin, see http://boxgrinder.org/tutorials/boxgrinder-build-plugins/#Operating_system_plugins. Supported OSes are: #{PluginManager.instance.plugins[:os].keys.join(", ")}" if os_plugin.nil? 69: raise "Not supported operating system version selected: #{@appliance_config.os.version}. Supported versions are: #{os_plugin[:versions].join(", ")}" unless @appliance_config.os.version.nil? or os_plugin[:versions].include?(@appliance_config.os.version) 70: end
# File lib/boxgrinder-build/appliance.rb, line 65 65: def validate_definition 66: os_plugin = PluginManager.instance.plugins[:os][@appliance_config.os.name.to_sym] 67: 68: raise "Not supported operating system selected: #{@appliance_config.os.name}. Make sure you have installed right operating system plugin, see http://boxgrinder.org/tutorials/boxgrinder-build-plugins/#Operating_system_plugins. Supported OSes are: #{PluginManager.instance.plugins[:os].keys.join(", ")}" if os_plugin.nil? 69: raise "Not supported operating system version selected: #{@appliance_config.os.version}. Supported versions are: #{os_plugin[:versions].join(", ")}" unless @appliance_config.os.version.nil? or os_plugin[:versions].include?(@appliance_config.os.version) 70: end