boxgrinder-build 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +13 -0
- data/Manifest +3 -3
- data/Rakefile +1 -1
- data/bin/boxgrinder +121 -0
- data/boxgrinder-build.gemspec +12 -12
- data/lib/boxgrinder-build.rb +19 -0
- data/lib/boxgrinder-build/appliance.rb +30 -35
- data/lib/boxgrinder-build/helpers/appliance-customize-helper.rb +2 -2
- data/lib/boxgrinder-build/helpers/augeas-helper.rb +2 -2
- data/lib/boxgrinder-build/helpers/guestfs-helper.rb +16 -7
- data/lib/boxgrinder-build/helpers/image-helper.rb +48 -20
- data/lib/boxgrinder-build/helpers/linux-helper.rb +2 -2
- data/lib/boxgrinder-build/helpers/package-helper.rb +9 -12
- data/lib/boxgrinder-build/helpers/plugin-helper.rb +11 -19
- data/lib/boxgrinder-build/helpers/thor-helper.rb +82 -0
- data/lib/boxgrinder-build/managers/plugin-manager.rb +10 -25
- data/lib/boxgrinder-build/plugins/base-plugin.rb +50 -33
- data/rubygem-boxgrinder-build.spec +20 -5
- data/spec/appliance-spec.rb +60 -46
- data/spec/helpers/guestfs-helper-spec.rb +123 -37
- data/spec/helpers/image-helper-spec.rb +126 -56
- data/spec/helpers/package-helper-spec.rb +35 -0
- data/spec/helpers/plugin-helper-spec.rb +64 -20
- data/spec/managers/plugin-manager-spec.rb +33 -2
- data/spec/plugins/base-plugin-spec.rb +83 -27
- metadata +21 -20
- data/bin/boxgrinder-build +0 -91
- data/spec/rspec/src/appliances/jeos-f13.appl +0 -27
- data/spec/rspec/src/appliances/jeos-f13.ks +0 -23
@@ -17,38 +17,39 @@
|
|
17
17
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
18
18
|
|
19
19
|
require 'fileutils'
|
20
|
+
require 'boxgrinder-core/helpers/log-helper'
|
20
21
|
require 'boxgrinder-build/helpers/guestfs-helper'
|
21
22
|
|
22
23
|
module BoxGrinder
|
23
24
|
class ImageHelper
|
24
25
|
def initialize(config, appliance_config, options = {})
|
25
|
-
@config
|
26
|
-
@appliance_config
|
26
|
+
@config = config
|
27
|
+
@appliance_config = appliance_config
|
27
28
|
|
28
|
-
@log
|
29
|
-
@exec_helper
|
29
|
+
@log = options[:log] || LogHelper.new
|
30
|
+
@exec_helper = options[:exec_helper] || ExecHelper.new(:log => @log)
|
30
31
|
end
|
31
32
|
|
32
33
|
def mount_image(disk, mount_dir)
|
33
|
-
offsets
|
34
|
+
offsets = calculate_disk_offsets(disk)
|
34
35
|
|
35
36
|
@log.debug "Mounting image #{File.basename(disk)} in #{mount_dir}..."
|
36
37
|
FileUtils.mkdir_p(mount_dir)
|
37
38
|
|
38
|
-
mounts
|
39
|
+
mounts = {}
|
39
40
|
|
40
41
|
offsets.each do |offset|
|
41
|
-
loop_device
|
42
|
-
@exec_helper.execute("losetup -o #{offset.to_s} #{loop_device} #{disk}")
|
43
|
-
label
|
42
|
+
loop_device = get_loop_device
|
43
|
+
@exec_helper.execute("losetup -o #{offset.to_s} #{loop_device} '#{disk}'")
|
44
|
+
label = @exec_helper.execute("e2label #{loop_device}").strip.chomp.gsub('_', '')
|
44
45
|
label = '/' if label == ''
|
45
46
|
mounts[label] = loop_device
|
46
47
|
end
|
47
48
|
|
48
|
-
@exec_helper.execute("mount #{mounts['/']} #{mount_dir}")
|
49
|
+
@exec_helper.execute("mount #{mounts['/']} '#{mount_dir}'")
|
49
50
|
|
50
51
|
mounts.reject { |key, value| key == '/' }.each do |mount_point, loop_device|
|
51
|
-
@exec_helper.execute("mount #{loop_device} #{mount_dir}#{mount_point}")
|
52
|
+
@exec_helper.execute("mount #{loop_device} '#{mount_dir}#{mount_point}'")
|
52
53
|
end
|
53
54
|
|
54
55
|
@log.trace "Mounts:\n#{mounts}"
|
@@ -66,6 +67,33 @@ module BoxGrinder
|
|
66
67
|
FileUtils.rm_rf(mount_dir)
|
67
68
|
end
|
68
69
|
|
70
|
+
def disk_info(disk)
|
71
|
+
YAML.load(@exec_helper.execute("qemu-img info '#{disk}'"))
|
72
|
+
end
|
73
|
+
|
74
|
+
def convert_disk(disk, format, destination)
|
75
|
+
@log.debug "Conveting '#{disk}' disk to #{format} format and moving it to '#{destination}'..."
|
76
|
+
|
77
|
+
unless File.exists?(destination)
|
78
|
+
info = disk_info(disk)
|
79
|
+
|
80
|
+
if info['file format'] == format.to_s
|
81
|
+
@exec_helper.execute "cp '#{disk}' '#{destination}'"
|
82
|
+
else
|
83
|
+
|
84
|
+
format_with_options = format.to_s
|
85
|
+
|
86
|
+
if format == :vmdk
|
87
|
+
format_with_options += (`qemu-img --help | grep '\\-6'`.strip.chomp.empty? ? ' -o compat6' : ' -6')
|
88
|
+
end
|
89
|
+
|
90
|
+
@exec_helper.execute "qemu-img convert -f #{info['file format']} -O #{format_with_options} '#{disk}' '#{destination}'"
|
91
|
+
end
|
92
|
+
else
|
93
|
+
@log.debug "Destination already exists, skipping disk conversion."
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
69
97
|
def get_loop_device
|
70
98
|
begin
|
71
99
|
loop_device = @exec_helper.execute("losetup -f 2>&1").strip
|
@@ -80,8 +108,8 @@ module BoxGrinder
|
|
80
108
|
@log.debug "Calculating offsets for '#{File.basename(disk)}' disk..."
|
81
109
|
loop_device = get_loop_device
|
82
110
|
|
83
|
-
@exec_helper.execute("losetup #{loop_device} #{disk}")
|
84
|
-
offsets
|
111
|
+
@exec_helper.execute("losetup #{loop_device} '#{disk}'")
|
112
|
+
offsets = @exec_helper.execute("parted #{loop_device} 'unit B print' | grep -e '^ [0-9]' | awk '{ print $2 }'").scan(/\d+/)
|
85
113
|
# wait one secont before freeing loop device
|
86
114
|
sleep 1
|
87
115
|
@exec_helper.execute("losetup -d #{loop_device}")
|
@@ -93,21 +121,21 @@ module BoxGrinder
|
|
93
121
|
|
94
122
|
def create_disk(disk, size)
|
95
123
|
@log.trace "Preparing disk..."
|
96
|
-
@exec_helper.execute "dd if=/dev/zero of
|
124
|
+
@exec_helper.execute "dd if=/dev/zero of='#{disk}' bs=1 count=0 seek=#{size * 1024}M"
|
97
125
|
@log.trace "Disk prepared"
|
98
126
|
end
|
99
127
|
|
100
|
-
def create_filesystem(
|
128
|
+
def create_filesystem(loop_device, options = {})
|
101
129
|
options = {
|
102
|
-
:type
|
103
|
-
:label
|
130
|
+
:type => @appliance_config.hardware.partitions['/']['type'],
|
131
|
+
:label => '/'
|
104
132
|
}.merge(options)
|
105
133
|
|
106
134
|
@log.trace "Creating filesystem..."
|
107
135
|
|
108
136
|
case options[:type]
|
109
137
|
when 'ext3', 'ext4'
|
110
|
-
@exec_helper.execute "mke2fs -T #{options[:type]} -L '#{options[:label]}' -F #{
|
138
|
+
@exec_helper.execute "mke2fs -T #{options[:type]} -L '#{options[:label]}' -F #{loop_device}"
|
111
139
|
else
|
112
140
|
raise "Unsupported filesystem specified: #{options[:type]}"
|
113
141
|
end
|
@@ -117,12 +145,12 @@ module BoxGrinder
|
|
117
145
|
|
118
146
|
def sync_files(from_dir, to_dir)
|
119
147
|
@log.debug "Syncing files between #{from_dir} and #{to_dir}..."
|
120
|
-
@exec_helper.execute "rsync -Xura #{from_dir}/* #{to_dir}"
|
148
|
+
@exec_helper.execute "rsync -Xura #{from_dir.gsub(' ', '\ ')}/* '#{to_dir}'"
|
121
149
|
@log.debug "Sync finished."
|
122
150
|
end
|
123
151
|
|
124
152
|
def customize(disk_path)
|
125
|
-
GuestFSHelper.new(disk_path, :log => @log).customize do |guestfs, guestfs_helper|
|
153
|
+
GuestFSHelper.new(disk_path, :log => @log).customize(:ide_disk => ((@appliance_config.os.name == 'rhel' or @appliance_config.os.name == 'centos') and @appliance_config.os.version == '5') ? true : false) do |guestfs, guestfs_helper|
|
126
154
|
yield guestfs, guestfs_helper
|
127
155
|
end
|
128
156
|
end
|
@@ -16,12 +16,12 @@
|
|
16
16
|
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
17
17
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
18
18
|
|
19
|
-
require '
|
19
|
+
require 'boxgrinder-core/helpers/log-helper'
|
20
20
|
|
21
21
|
module BoxGrinder
|
22
22
|
class LinuxHelper
|
23
23
|
def initialize( options = {} )
|
24
|
-
@log = options[:log] ||
|
24
|
+
@log = options[:log] || LogHelper.new
|
25
25
|
end
|
26
26
|
|
27
27
|
def kernel_version( guestfs )
|
@@ -16,15 +16,16 @@
|
|
16
16
|
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
17
17
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
18
18
|
|
19
|
+
require 'boxgrinder-core/helpers/log-helper'
|
20
|
+
|
19
21
|
module BoxGrinder
|
20
22
|
class PackageHelper
|
21
|
-
def initialize(config, appliance_config,
|
22
|
-
@config
|
23
|
+
def initialize(config, appliance_config, options = {})
|
24
|
+
@config = config
|
23
25
|
@appliance_config = appliance_config
|
24
|
-
@dir = dir
|
25
26
|
|
26
|
-
@log
|
27
|
-
@exec_helper
|
27
|
+
@log = options[:log] || LogHelper.new
|
28
|
+
@exec_helper = options[:exec_helper] || ExecHelper.new(:log => @log)
|
28
29
|
end
|
29
30
|
|
30
31
|
def package(dir, package, type = :tar)
|
@@ -38,17 +39,13 @@ module BoxGrinder
|
|
38
39
|
case type
|
39
40
|
when :tar
|
40
41
|
package_name = File.basename(package, '.tgz')
|
41
|
-
symlink
|
42
|
+
symlink = "#{File.dirname(package)}/#{package_name}"
|
42
43
|
|
43
44
|
FileUtils.ln_s(File.expand_path(dir), symlink)
|
44
|
-
|
45
|
-
Dir.chdir(File.dirname(package)) do
|
46
|
-
@exec_helper.execute "tar -hcvzf #{package_name}.tgz #{package_name}"
|
47
|
-
end
|
48
|
-
|
45
|
+
@exec_helper.execute "tar -C '#{File.dirname(package)}' -hcvzf '#{package}' '#{package_name}'"
|
49
46
|
FileUtils.rm(symlink)
|
50
47
|
else
|
51
|
-
raise "
|
48
|
+
raise "Specified format: '#{type}' is currently unsupported."
|
52
49
|
end
|
53
50
|
|
54
51
|
@log.info "Appliance #{@appliance_config.name} packaged."
|
@@ -16,14 +16,15 @@
|
|
16
16
|
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
17
17
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
18
18
|
|
19
|
-
require 'boxgrinder-build/managers/plugin-manager'
|
20
19
|
require 'rubygems'
|
20
|
+
require 'boxgrinder-build/managers/plugin-manager'
|
21
|
+
require 'boxgrinder-core/helpers/log-helper'
|
21
22
|
|
22
23
|
module BoxGrinder
|
23
24
|
class PluginHelper
|
24
|
-
def initialize( options = {} )
|
25
|
-
@
|
26
|
-
@
|
25
|
+
def initialize( config, options = {} )
|
26
|
+
@options = config
|
27
|
+
@log = options[:log] || LogHelper.new
|
27
28
|
end
|
28
29
|
|
29
30
|
def load_plugins
|
@@ -40,27 +41,18 @@ module BoxGrinder
|
|
40
41
|
self
|
41
42
|
end
|
42
43
|
|
43
|
-
def parse_plugin_list
|
44
|
-
plugins = []
|
45
|
-
|
46
|
-
unless @options.plugins.nil?
|
47
|
-
plugins = @options.plugins.gsub('\'', '').gsub('"', '').split(',')
|
48
|
-
plugins.each { |plugin| plugin.chomp!; plugin.strip! }
|
49
|
-
end
|
50
|
-
|
51
|
-
plugins
|
52
|
-
end
|
53
|
-
|
54
44
|
def read_and_require
|
55
|
-
plugins = %w(boxgrinder-build-fedora-os-plugin boxgrinder-build-rhel-os-plugin boxgrinder-build-centos-os-plugin boxgrinder-build-ec2-platform-plugin boxgrinder-build-vmware-platform-plugin boxgrinder-build-s3-delivery-plugin boxgrinder-build-sftp-delivery-plugin boxgrinder-build-local-delivery-plugin boxgrinder-build-ebs-delivery-plugin) +
|
45
|
+
plugins = %w(boxgrinder-build-fedora-os-plugin boxgrinder-build-rhel-os-plugin boxgrinder-build-centos-os-plugin boxgrinder-build-ec2-platform-plugin boxgrinder-build-vmware-platform-plugin boxgrinder-build-virtualbox-platform-plugin boxgrinder-build-s3-delivery-plugin boxgrinder-build-sftp-delivery-plugin boxgrinder-build-local-delivery-plugin boxgrinder-build-ebs-delivery-plugin) + @options.additional_plugins
|
56
46
|
|
57
47
|
plugins.flatten.each do |plugin|
|
58
|
-
@log.trace "
|
48
|
+
@log.trace "Loading plugin '#{plugin}'..."
|
59
49
|
|
60
50
|
begin
|
61
51
|
require plugin
|
62
|
-
|
63
|
-
|
52
|
+
@log.trace "- OK"
|
53
|
+
rescue LoadError => e
|
54
|
+
@log.trace "- Not found: #{e.message.strip.chomp}"
|
55
|
+
@log.warn "Specified plugin: '#{plugin}' wasn't found. Make sure its name is correct, skipping..." unless plugin.match(/^boxgrinder-build-(.*)-plugin/)
|
64
56
|
end
|
65
57
|
end
|
66
58
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# Copyright 2010 Red Hat, Inc.
|
2
|
+
#
|
3
|
+
# This is free software; you can redistribute it and/or modify it
|
4
|
+
# under the terms of the GNU Lesser General Public License as
|
5
|
+
# published by the Free Software Foundation; either version 3 of
|
6
|
+
# the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This software is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this software; if not, write to the Free
|
15
|
+
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
16
|
+
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
17
|
+
|
18
|
+
require 'thor'
|
19
|
+
|
20
|
+
class Thor
|
21
|
+
module CoreExt
|
22
|
+
class HashWithIndifferentAccess < ::Hash
|
23
|
+
def initialize(hash={})
|
24
|
+
super()
|
25
|
+
hash.each do |key, value|
|
26
|
+
self[convert_key(key)] = value
|
27
|
+
end
|
28
|
+
|
29
|
+
to_boolean(self)
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_boolean(h)
|
33
|
+
h.each do |k, v|
|
34
|
+
if v.is_a?(Hash)
|
35
|
+
to_boolean(v)
|
36
|
+
next
|
37
|
+
end
|
38
|
+
|
39
|
+
next unless v.is_a?(String)
|
40
|
+
|
41
|
+
case v
|
42
|
+
when /^true$/i then
|
43
|
+
h[k] = true
|
44
|
+
when /^false$/i then
|
45
|
+
h[k] = false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
module BoxGrinder
|
54
|
+
class ThorHelper < Thor
|
55
|
+
class << self
|
56
|
+
def help(shell)
|
57
|
+
boxgrinder_header(shell)
|
58
|
+
super(shell)
|
59
|
+
end
|
60
|
+
|
61
|
+
def task_help(shell, task_name)
|
62
|
+
boxgrinder_header(shell)
|
63
|
+
|
64
|
+
help_method = "#{task_name}_help".to_sym
|
65
|
+
send(help_method, shell) if respond_to?(help_method) and method(help_method).arity == 1
|
66
|
+
super(shell, task_name)
|
67
|
+
|
68
|
+
shell.say
|
69
|
+
end
|
70
|
+
|
71
|
+
def boxgrinder_header(shell)
|
72
|
+
shell.say
|
73
|
+
shell.say "BoxGrinder Build:"
|
74
|
+
shell.say " A tool for building VM images from simple definition files."
|
75
|
+
shell.say
|
76
|
+
shell.say "Documentation:"
|
77
|
+
shell.say " http://community.jboss.org/docs/DOC-14358"
|
78
|
+
shell.say
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -20,8 +20,8 @@ require 'singleton'
|
|
20
20
|
|
21
21
|
module BoxGrinder
|
22
22
|
module Plugins
|
23
|
-
def plugin(
|
24
|
-
PluginManager.instance.register_plugin(
|
23
|
+
def plugin(args)
|
24
|
+
PluginManager.instance.register_plugin(args)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -34,11 +34,11 @@ module BoxGrinder
|
|
34
34
|
include Singleton
|
35
35
|
|
36
36
|
def initialize
|
37
|
-
@plugins = {
|
37
|
+
@plugins = {:delivery => {}, :os => {}, :platform => {}}
|
38
38
|
end
|
39
39
|
|
40
|
-
def register_plugin(
|
41
|
-
validate_plugin_info(
|
40
|
+
def register_plugin(info)
|
41
|
+
validate_plugin_info(info)
|
42
42
|
|
43
43
|
raise "We already have registered plugin for #{info[:name]}." unless @plugins[info[:name]].nil?
|
44
44
|
|
@@ -53,13 +53,13 @@ module BoxGrinder
|
|
53
53
|
self
|
54
54
|
end
|
55
55
|
|
56
|
-
def validate_plugin_info(
|
56
|
+
def validate_plugin_info(info)
|
57
57
|
raise "No name specified for your plugin" if info[:name].nil?
|
58
58
|
raise "No class specified for your plugin" if info[:class].nil?
|
59
59
|
raise "No type specified for your plugin" if info[:type].nil?
|
60
60
|
end
|
61
61
|
|
62
|
-
def initialize_plugin(
|
62
|
+
def initialize_plugin(type, name)
|
63
63
|
plugins = @plugins[type]
|
64
64
|
# this should never happen
|
65
65
|
raise "There are no #{type} plugins." if plugins.nil?
|
@@ -68,26 +68,11 @@ module BoxGrinder
|
|
68
68
|
|
69
69
|
begin
|
70
70
|
plugin = plugin_info[:class].new
|
71
|
-
rescue
|
72
|
-
raise "Error while initializing #{plugin_info[:class]} plugin."
|
71
|
+
rescue
|
72
|
+
raise "Error while initializing '#{plugin_info[:class].to_s}' plugin."
|
73
73
|
end
|
74
74
|
|
75
|
-
[
|
76
|
-
end
|
77
|
-
|
78
|
-
def plugin_types( type )
|
79
|
-
types = []
|
80
|
-
|
81
|
-
available_plugins_for_selected_type = @plugins[type]
|
82
|
-
|
83
|
-
unless available_plugins_for_selected_type.nil?
|
84
|
-
available_plugins_for_selected_type.each_value do |info|
|
85
|
-
types << info[:types] unless info[:types].nil?
|
86
|
-
types << info[:name]
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
types.flatten
|
75
|
+
[plugin, plugin_info]
|
91
76
|
end
|
92
77
|
|
93
78
|
attr_reader :plugins
|
@@ -28,31 +28,31 @@ require 'logger'
|
|
28
28
|
module BoxGrinder
|
29
29
|
class BasePlugin
|
30
30
|
def initialize
|
31
|
-
@plugin_config
|
31
|
+
@plugin_config = {}
|
32
32
|
|
33
|
-
@deliverables
|
34
|
-
@supported_oses
|
33
|
+
@deliverables = OpenCascade.new
|
34
|
+
@supported_oses = OpenCascade.new
|
35
35
|
@target_deliverables = OpenCascade.new
|
36
|
-
@dir
|
36
|
+
@dir = OpenCascade.new
|
37
37
|
end
|
38
38
|
|
39
39
|
def init(config, appliance_config, options = {})
|
40
|
-
@config
|
41
|
-
@appliance_config
|
42
|
-
@options
|
43
|
-
@log
|
44
|
-
@exec_helper
|
45
|
-
@image_helper
|
46
|
-
@
|
47
|
-
@
|
48
|
-
@previous_deliverables = options[:previous_deliverables] || {}
|
40
|
+
@config = config
|
41
|
+
@appliance_config = appliance_config
|
42
|
+
@options = options
|
43
|
+
@log = options[:log] || Logger.new(STDOUT)
|
44
|
+
@exec_helper = options[:exec_helper] || ExecHelper.new(:log => @log)
|
45
|
+
@image_helper = options[:image_helper] || ImageHelper.new(@config, @appliance_config, :log => @log)
|
46
|
+
@previous_plugin_info = options[:previous_plugin_info]
|
47
|
+
@previous_deliverables = options[:previous_deliverables] || OpenCascade.new
|
49
48
|
|
50
|
-
@
|
51
|
-
@dir.tmp = "#{@dir.base}/tmp"
|
49
|
+
@plugin_info = options[:plugin_info]
|
52
50
|
|
53
|
-
@
|
51
|
+
@dir.base = "#{@appliance_config.path.build}/#{@plugin_info[:name]}-plugin"
|
52
|
+
@dir.tmp = "#{@dir.base}/tmp"
|
54
53
|
|
55
54
|
read_plugin_config
|
55
|
+
merge_plugin_config
|
56
56
|
|
57
57
|
@move_deliverables = true
|
58
58
|
@initialized = true
|
@@ -67,7 +67,7 @@ module BoxGrinder
|
|
67
67
|
raise "Please specify deliverables as Hash, not #{deliverable.class}." unless deliverable.is_a?(Hash)
|
68
68
|
|
69
69
|
deliverable.each do |name, path|
|
70
|
-
@deliverables[name]
|
70
|
+
@deliverables[name] = "#{@dir.tmp}/#{path}"
|
71
71
|
@target_deliverables[name] = "#{@dir.base}/#{path}"
|
72
72
|
end
|
73
73
|
end
|
@@ -80,6 +80,7 @@ module BoxGrinder
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def is_supported_os?
|
83
|
+
return true if @supported_oses.empty?
|
83
84
|
return false unless !@supported_oses[@appliance_config.os.name].nil? and @supported_oses[@appliance_config.os.name].include?(@appliance_config.os.version)
|
84
85
|
true
|
85
86
|
end
|
@@ -108,10 +109,8 @@ module BoxGrinder
|
|
108
109
|
def validate_plugin_config(fields = [], doc = nil)
|
109
110
|
more_info = doc.nil? ? '' : "See #{doc} for more info"
|
110
111
|
|
111
|
-
raise "Not valid configuration file for #{info[:name]} plugin. Please create valid '#{@config_file}' file. #{more_info}" if @plugin_config.nil?
|
112
|
-
|
113
112
|
fields.each do |field|
|
114
|
-
raise "Please specify a valid '#{field}' key in
|
113
|
+
raise "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?
|
115
114
|
end
|
116
115
|
end
|
117
116
|
|
@@ -120,18 +119,18 @@ module BoxGrinder
|
|
120
119
|
end
|
121
120
|
|
122
121
|
def run(*args)
|
122
|
+
unless is_supported_os?
|
123
|
+
@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."
|
124
|
+
return
|
125
|
+
end
|
126
|
+
|
123
127
|
FileUtils.rm_rf @dir.tmp
|
124
128
|
FileUtils.mkdir_p @dir.tmp
|
125
129
|
|
126
130
|
execute(*args)
|
127
131
|
|
128
|
-
|
129
|
-
end
|
132
|
+
# TODO execute post commands for platform plugins here?
|
130
133
|
|
131
|
-
def after_init
|
132
|
-
end
|
133
|
-
|
134
|
-
def after_execute
|
135
134
|
@deliverables.each do |name, path|
|
136
135
|
@log.trace "Moving '#{path}' deliverable to target destination '#{@target_deliverables[name]}'..."
|
137
136
|
FileUtils.mv(path, @target_deliverables[name])
|
@@ -140,6 +139,12 @@ module BoxGrinder
|
|
140
139
|
FileUtils.rm_rf @dir.tmp
|
141
140
|
end
|
142
141
|
|
142
|
+
def after_init
|
143
|
+
end
|
144
|
+
|
145
|
+
def after_execute
|
146
|
+
end
|
147
|
+
|
143
148
|
def deliverables_exists?
|
144
149
|
raise "You can only check deliverables after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
|
145
150
|
|
@@ -163,16 +168,28 @@ module BoxGrinder
|
|
163
168
|
@plugin_config[key] = @plugin_config[key].nil? ? value : @plugin_config[key]
|
164
169
|
end
|
165
170
|
|
171
|
+
# This reads the plugin config from file
|
166
172
|
def read_plugin_config
|
167
|
-
return
|
173
|
+
return if @config[:plugins].nil? or @config[:plugins][@plugin_info[:name].to_s].nil?
|
168
174
|
|
169
|
-
@log.debug "Reading configuration
|
175
|
+
@log.debug "Reading configuration for #{@plugin_info[:full_name]} plugin."
|
170
176
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
177
|
+
@plugin_config = @config[:plugins][@plugin_info[:name].to_s]
|
178
|
+
end
|
179
|
+
|
180
|
+
# This merges the plugin config with configuration provided in command line
|
181
|
+
def merge_plugin_config
|
182
|
+
config =
|
183
|
+
case @plugin_info[:type]
|
184
|
+
when :os
|
185
|
+
@config.os_config
|
186
|
+
when :platform
|
187
|
+
@config.platform_config
|
188
|
+
when :delivery
|
189
|
+
@config.delivery_config
|
190
|
+
end
|
191
|
+
|
192
|
+
@plugin_config.merge!(config)
|
176
193
|
end
|
177
194
|
end
|
178
195
|
end
|