| 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