Class BoxGrinder::Appliance
In: lib/boxgrinder-build/appliance.rb
lib/boxgrinder-build/appliance.rb
Parent: Object

Methods

Attributes

appliance_config  [R] 
appliance_config  [R] 
plugin_chain  [R] 
plugin_chain  [R] 

Public Class methods

[Source]

    # 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

[Source]

    # 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

Public Instance methods

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

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

[Source]

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

[Source]

    # 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

[Source]

     # 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

[Source]

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

[Source]

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

[Source]

    # 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

[Source]

     # 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

[Source]

     # 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

[Source]

    # 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

[Source]

    # 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

[Validate]