Class BoxGrinder::BasePlugin
In: lib/boxgrinder-build/plugins/base-plugin.rb
lib/boxgrinder-build/plugins/base-plugin.rb
Parent: Object

Methods

Attributes

deliverables  [R] 
deliverables  [R] 
plugin_info  [R] 
plugin_info  [R] 

Public Class methods

[Source]

    # File lib/boxgrinder-build/plugins/base-plugin.rb, line 35
35:     def initialize
36:       @plugin_config = {}
37: 
38:       @deliverables = OpenCascade.new
39:       @supported_oses = OpenCascade.new
40:       @supported_platforms = []
41:       @target_deliverables = OpenCascade.new
42:       @dir = OpenCascade.new
43:     end

[Source]

    # File lib/boxgrinder-build/plugins/base-plugin.rb, line 35
35:     def initialize
36:       @plugin_config = {}
37: 
38:       @deliverables = OpenCascade.new
39:       @supported_oses = OpenCascade.new
40:       @supported_platforms = []
41:       @target_deliverables = OpenCascade.new
42:       @dir = OpenCascade.new
43:     end

Public Instance methods

Callback - executed after execution.

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 101
101:     def after_execute
102:     end

Callback - executed after execution.

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 101
101:     def after_execute
102:     end

Callback - executed after initialization.

[Source]

    # File lib/boxgrinder-build/plugins/base-plugin.rb, line 97
97:     def after_init
98:     end

Callback - executed after initialization.

[Source]

    # File lib/boxgrinder-build/plugins/base-plugin.rb, line 97
97:     def after_init
98:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 158
158:     def current_platform
159:       platform = :raw
160: 
161:       if @previous_plugin_info[:type] == :platform
162:         platform = @previous_plugin_info[:name]
163:       end unless @previous_plugin_info.nil?
164: 
165:       platform.to_s
166:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 158
158:     def current_platform
159:       platform = :raw
160: 
161:       if @previous_plugin_info[:type] == :platform
162:         platform = @previous_plugin_info[:name]
163:       end unless @previous_plugin_info.nil?
164: 
165:       platform.to_s
166:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 223
223:     def deliverables
224:       @target_deliverables
225:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 223
223:     def deliverables
224:       @target_deliverables
225:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 206
206:     def deliverables_exists?
207:       raise "You can only check deliverables after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
208: 
209:       return false if deliverables.empty?
210: 
211:       exists = true
212: 
213:       deliverables.each_value do |file|
214:         unless File.exists?(file)
215:           exists = false
216:           break
217:         end
218:       end
219: 
220:       exists
221:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 206
206:     def deliverables_exists?
207:       raise "You can only check deliverables after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
208: 
209:       return false if deliverables.empty?
210: 
211:       exists = true
212: 
213:       deliverables.each_value do |file|
214:         unless File.exists?(file)
215:           exists = false
216:           break
217:         end
218:       end
219: 
220:       exists
221:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 176
176:     def execute(args = nil)
177:       raise "You can only execute the plugin after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
178:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 176
176:     def execute(args = nil)
177:       raise "You can only execute the plugin after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
178:     end

[Source]

    # File lib/boxgrinder-build/plugins/base-plugin.rb, line 45
45:     def init(config, appliance_config, info, options = {})
46:       @config = config
47:       @appliance_config = appliance_config
48:       @options = options
49:       @plugin_info = info
50: 
51:       # Optional options :)
52:       @type = options[:type] || @plugin_info[:name]
53:       @previous_plugin = options[:previous_plugin]
54:       @log = options[:log] || LogHelper.new
55:       @exec_helper = options[:exec_helper] || ExecHelper.new(:log => @log)
56:       @image_helper = options[:image_helper] || ImageHelper.new(@config, @appliance_config, :log => @log)
57: 
58:       @dir.base = "#{@appliance_config.path.build}/#{@plugin_info[:name]}-plugin"
59:       @dir.tmp = "#{@dir.base}/tmp"
60: 
61:       if @previous_plugin
62:         @previous_deliverables = @previous_plugin.deliverables
63:         @previous_plugin_info = @previous_plugin.plugin_info
64:       else
65:         @previous_deliverables = OpenCascade.new
66:       end
67: 
68:       # TODO get rid of that - we don't have plugin configuration files - everything is now in one place.
69:       read_plugin_config
70:       merge_plugin_config
71: 
72:       # Indicate whether deliverables of select plugin should be moved to final destination or not.
73:       # TODO Needs some thoughts - if we don't have deliverables that we care about - should they be in @deliverables?
74:       @move_deliverables = true
75: 
76:       # Validate the plugin configuration.
77:       # Please make the validate method as simple as possible, because it'll be executed also in unit tests.
78:       validate
79: 
80:       # The plugin is initialized now. We can do some fancy stuff with it.
81:       @initialized = true
82: 
83:       # If there is something defined in the plugin that should be executed after plugin initialization - it should go 
84:       # to after_init method.
85:       after_init
86: 
87:       self
88:     end

[Source]

    # File lib/boxgrinder-build/plugins/base-plugin.rb, line 45
45:     def init(config, appliance_config, info, options = {})
46:       @config = config
47:       @appliance_config = appliance_config
48:       @options = options
49:       @plugin_info = info
50: 
51:       # Optional options :)
52:       @type = options[:type] || @plugin_info[:name]
53:       @previous_plugin = options[:previous_plugin]
54:       @log = options[:log] || LogHelper.new
55:       @exec_helper = options[:exec_helper] || ExecHelper.new(:log => @log)
56:       @image_helper = options[:image_helper] || ImageHelper.new(@config, @appliance_config, :log => @log)
57: 
58:       @dir.base = "#{@appliance_config.path.build}/#{@plugin_info[:name]}-plugin"
59:       @dir.tmp = "#{@dir.base}/tmp"
60: 
61:       if @previous_plugin
62:         @previous_deliverables = @previous_plugin.deliverables
63:         @previous_plugin_info = @previous_plugin.plugin_info
64:       else
65:         @previous_deliverables = OpenCascade.new
66:       end
67: 
68:       # TODO get rid of that - we don't have plugin configuration files - everything is now in one place.
69:       read_plugin_config
70:       merge_plugin_config
71: 
72:       # Indicate whether deliverables of select plugin should be moved to final destination or not.
73:       # TODO Needs some thoughts - if we don't have deliverables that we care about - should they be in @deliverables?
74:       @move_deliverables = true
75: 
76:       # Validate the plugin configuration.
77:       # Please make the validate method as simple as possible, because it'll be executed also in unit tests.
78:       validate
79: 
80:       # The plugin is initialized now. We can do some fancy stuff with it.
81:       @initialized = true
82: 
83:       # If there is something defined in the plugin that should be executed after plugin initialization - it should go 
84:       # to after_init method.
85:       after_init
86: 
87:       self
88:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 141
141:     def is_supported_os?
142:       return true if @supported_oses.empty?
143:       return false unless !@supported_oses[@appliance_config.os.name].nil? and @supported_oses[@appliance_config.os.name].include?(@appliance_config.os.version)
144:       true
145:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 141
141:     def is_supported_os?
142:       return true if @supported_oses.empty?
143:       return false unless !@supported_oses[@appliance_config.os.name].nil? and @supported_oses[@appliance_config.os.name].include?(@appliance_config.os.version)
144:       true
145:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 135
135:     def is_supported_platform?
136:       return true if @supported_platforms.empty?
137:       return false if @previous_plugin_info[:type] == :platform and !@supported_platforms.include?(@previous_plugin_info[:name])
138:       true
139:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 135
135:     def is_supported_platform?
136:       return true if @supported_platforms.empty?
137:       return false if @previous_plugin_info[:type] == :platform and !@supported_platforms.include?(@previous_plugin_info[:name])
138:       true
139:     end

This merges the plugin config with configuration provided in command line

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 238
238:     def merge_plugin_config
239:       config =
240:           case @plugin_info[:type]
241:             when :os
242:               @config.os_config
243:             when :platform
244:               @config.platform_config
245:             when :delivery
246:               @config.delivery_config
247:           end
248: 
249:       @plugin_config.merge!(config)
250:     end

This merges the plugin config with configuration provided in command line

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 238
238:     def merge_plugin_config
239:       config =
240:           case @plugin_info[:type]
241:             when :os
242:               @config.os_config
243:             when :platform
244:               @config.platform_config
245:             when :delivery
246:               @config.delivery_config
247:           end
248: 
249:       @plugin_config.merge!(config)
250:     end

This reads the plugin config from file

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 232
232:     def read_plugin_config
233:       return if @config[:plugins].nil? or @config[:plugins][@plugin_info[:name].to_s].nil?
234:       @plugin_config = @config[:plugins][@plugin_info[:name].to_s]
235:     end

This reads the plugin config from file

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 232
232:     def read_plugin_config
233:       return if @config[:plugins].nil? or @config[:plugins][@plugin_info[:name].to_s].nil?
234:       @plugin_config = @config[:plugins][@plugin_info[:name].to_s]
235:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 113
113:     def register_deliverable(deliverable)
114:       raise "You can only register deliverables after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
115:       raise "Please specify deliverables as Hash, not #{deliverable.class}." unless deliverable.is_a?(Hash)
116: 
117:       deliverable.each do |name, path|
118:         @deliverables[name] = "#{@dir.tmp}/#{path}"
119:         @target_deliverables[name] = "#{@dir.base}/#{path}"
120:       end
121:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 113
113:     def register_deliverable(deliverable)
114:       raise "You can only register deliverables after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
115:       raise "Please specify deliverables as Hash, not #{deliverable.class}." unless deliverable.is_a?(Hash)
116: 
117:       deliverable.each do |name, path|
118:         @deliverables[name] = "#{@dir.tmp}/#{path}"
119:         @target_deliverables[name] = "#{@dir.base}/#{path}"
120:       end
121:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 123
123:     def register_supported_os(name, versions)
124:       raise "You can register supported operating system only after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
125: 
126:       @supported_oses[name] = OpenCascade.new if @supported_oses[name].nil?
127:       @supported_oses[name] = versions
128:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 123
123:     def register_supported_os(name, versions)
124:       raise "You can register supported operating system only after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
125: 
126:       @supported_oses[name] = OpenCascade.new if @supported_oses[name].nil?
127:       @supported_oses[name] = versions
128:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 130
130:     def register_supported_platform(name)
131:       raise "You can register supported platform only after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
132:       @supported_platforms << name
133:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 130
130:     def register_supported_platform(name)
131:       raise "You can register supported platform only after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
132:       @supported_platforms << name
133:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 180
180:     def run(param = nil)
181:       unless is_supported_os?
182:         @log.error "#{@plugin_info[:full_name]} plugin supports following operating systems: #{supported_oses}. Your appliance contains #{@appliance_config.os.name} #{@appliance_config.os.version} operating system which is not supported by this plugin, sorry."
183:         return
184:       end
185: 
186:       unless is_supported_platform?
187:         @log.error "#{@plugin_info[:full_name]} plugin supports following platforms: #{@supported_platforms.join(', ')}. You selected #{@previous_plugin_info[:name]} platform which is not supported by this plugin, sorry."
188:         return
189:       end
190: 
191:       FileUtils.rm_rf @dir.tmp
192:       FileUtils.mkdir_p @dir.tmp
193: 
194:       param.nil? ? execute : execute(param)
195: 
196:       # TODO execute post commands for platform plugins here?
197: 
198:       @deliverables.each do |name, path|
199:         @log.trace "Moving '#{path}' deliverable to target destination '#{@target_deliverables[name]}'..."
200:         FileUtils.mv(path, @target_deliverables[name])
201:       end if @move_deliverables
202: 
203:       FileUtils.rm_rf @dir.tmp
204:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 180
180:     def run(param = nil)
181:       unless is_supported_os?
182:         @log.error "#{@plugin_info[:full_name]} plugin supports following operating systems: #{supported_oses}. Your appliance contains #{@appliance_config.os.name} #{@appliance_config.os.version} operating system which is not supported by this plugin, sorry."
183:         return
184:       end
185: 
186:       unless is_supported_platform?
187:         @log.error "#{@plugin_info[:full_name]} plugin supports following platforms: #{@supported_platforms.join(', ')}. You selected #{@previous_plugin_info[:name]} platform which is not supported by this plugin, sorry."
188:         return
189:       end
190: 
191:       FileUtils.rm_rf @dir.tmp
192:       FileUtils.mkdir_p @dir.tmp
193: 
194:       param.nil? ? execute : execute(param)
195: 
196:       # TODO execute post commands for platform plugins here?
197: 
198:       @deliverables.each do |name, path|
199:         @log.trace "Moving '#{path}' deliverable to target destination '#{@target_deliverables[name]}'..."
200:         FileUtils.mv(path, @target_deliverables[name])
201:       end if @move_deliverables
202: 
203:       FileUtils.rm_rf @dir.tmp
204:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 227
227:     def set_default_config_value(key, value)
228:       @plugin_config[key] = @plugin_config[key].nil? ? value : @plugin_config[key]
229:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 227
227:     def set_default_config_value(key, value)
228:       @plugin_config[key] = @plugin_config[key].nil? ? value : @plugin_config[key]
229:     end

Validation helper method.

Execute the validation only for selected plugin type. TODO make this prettier somehow? Maybe moving validation to a class?

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 108
108:     def subtype(type)
109:       return unless @type == type
110:       yield if block_given?
111:     end

Validation helper method.

Execute the validation only for selected plugin type. TODO make this prettier somehow? Maybe moving validation to a class?

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 108
108:     def subtype(type)
109:       return unless @type == type
110:       yield if block_given?
111:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 147
147:     def supported_oses
148:       supported = ""
149: 
150:       @supported_oses.sort.each do |name, versions|
151:         supported << ", " unless supported.empty?
152:         supported << "#{name} (versions: #{versions.join(", ")})"
153:       end
154: 
155:       supported
156:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 147
147:     def supported_oses
148:       supported = ""
149: 
150:       @supported_oses.sort.each do |name, versions|
151:         supported << ", " unless supported.empty?
152:         supported << "#{name} (versions: #{versions.join(", ")})"
153:       end
154: 
155:       supported
156:     end

This is a stub that should be overriden by the actual plugin implementation. It can use subtype(:TYPE) calls to validate for a specific type. KISS!

[Source]

    # File lib/boxgrinder-build/plugins/base-plugin.rb, line 93
93:     def validate
94:     end

This is a stub that should be overriden by the actual plugin implementation. It can use subtype(:TYPE) calls to validate for a specific type. KISS!

[Source]

    # File lib/boxgrinder-build/plugins/base-plugin.rb, line 93
93:     def validate
94:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 168
168:     def validate_plugin_config(fields = [], doc = nil)
169:       more_info = doc.nil? ? '' : "See #{doc} for more info"
170: 
171:       fields.each do |field|
172:         raise PluginValidationError, "Please specify a valid '#{field}' key in BoxGrinder configuration file: '#{@config.file}' or use CLI '--#{@plugin_info[:type]}-config #{field}:DATA' argument. #{more_info}" if @plugin_config[field].nil?
173:       end
174:     end

[Source]

     # File lib/boxgrinder-build/plugins/base-plugin.rb, line 168
168:     def validate_plugin_config(fields = [], doc = nil)
169:       more_info = doc.nil? ? '' : "See #{doc} for more info"
170: 
171:       fields.each do |field|
172:         raise PluginValidationError, "Please specify a valid '#{field}' key in BoxGrinder configuration file: '#{@config.file}' or use CLI '--#{@plugin_info[:type]}-config #{field}:DATA' argument. #{more_info}" if @plugin_config[field].nil?
173:       end
174:     end

[Validate]