boxgrinder-build 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README CHANGED
@@ -1,4 +1,7 @@
1
- Look here!
2
- ==========
1
+ Project home page
3
2
 
4
- http://www.jboss.org/stormgrind/projects/boxgrinder/build.html
3
+ http://www.jboss.org/stormgrind/projects/boxgrinder/build.html
4
+
5
+ Project documentation
6
+
7
+ http://community.jboss.org/docs/DOC-14358
data/bin/boxgrinder-build CHANGED
@@ -26,7 +26,7 @@ require 'boxgrinder-core/helpers/log-helper'
26
26
  require 'boxgrinder-build/helpers/plugin-helper'
27
27
  require 'boxgrinder-build/appliance'
28
28
 
29
- gem 'boxgrinder-core', '>= 0.0.6'
29
+ gem 'boxgrinder-core', '>= 0.0.8'
30
30
  gem 'aws-s3', '>= 0.6.2'
31
31
  gem 'amazon-ec2', '>= 0.9.6'
32
32
  gem 'net-sftp', '>= 2.0.4'
@@ -44,7 +44,9 @@ program :version, '0.3.0'
44
44
  program :description, 'A tool for building VM images from simple definition files.'
45
45
  default_command :build
46
46
 
47
- global_option('-V', '--verbose', TrueClass, "Prints verbose information while building. Default: false.") { ENV['BG_LOG_THRESHOLD'] = 'debug'}
47
+ $verbose = false
48
+
49
+ global_option('-V', '--verbose', TrueClass, "Prints verbose information while building. Default: false.") { $verbose = true}
48
50
 
49
51
  module BoxGrinder
50
52
  log = LogHelper.new
@@ -58,14 +60,13 @@ module BoxGrinder
58
60
  c.option '-p STRING', '--platform STRING', String, "The type of platform. Valid types are: #{PlatformPluginManager.instance.plugins.keys.join(', ')}. Default: none."
59
61
  c.option '-d STRING', '--delivery STRING', String, "The delivery type for selected image. Valid types are: #{DeliveryPluginManager.instance.types.keys.join(', ')}. Default: none."
60
62
  c.option '-f', '--force', TrueClass, "Force image creation - removes all previous builds for selected appliance. Default: false."
61
- #c.option '-V', '--verbose', TrueClass, "Prints verbose information while building. Default: false."
62
63
 
63
64
  c.action do |args, options|
64
65
  options.default :platform => :none
65
66
  options.default :delivery => :none
66
67
  options.default :force => false
67
- options.default :verbose => false
68
68
 
69
+ options.verbose = $verbose
69
70
  options.platform = options.platform.to_s.downcase.to_sym
70
71
  options.delivery = options.delivery.to_s.downcase.to_sym
71
72
 
@@ -75,7 +76,7 @@ module BoxGrinder
75
76
  raise "Not known platform: #{options.platform}. Available platforms: #{PlatformPluginManager.instance.plugins.keys.join(', ')}." if PlatformPluginManager.instance.plugins[options.platform].nil? and options.platform != :none
76
77
  raise "Not known delivery type: #{options.delivery}. Available types: #{DeliveryPluginManager.instance.types.keys.join(', ')}." if DeliveryPluginManager.instance.types.keys.include?(options.delivery).nil? and options.delivery != :none
77
78
 
78
- Appliance.new( appliance_definition_file, :options => options, :log => log ).create
79
+ Appliance.new( appliance_definition_file, :options => options, :log => LogHelper.new( :threshold => $verbose ? :debug : :info ) ).create
79
80
  end
80
81
  end
81
82
  end
@@ -20,33 +20,27 @@
20
20
 
21
21
  require 'AWS'
22
22
  require 'aws/s3'
23
- require 'boxgrinder-core/defaults'
24
- require 'boxgrinder-build/validators/aws-validator'
25
23
 
26
24
  module BoxGrinder
27
25
  class AWSHelper
28
- def initialize( config, appliance_config )
26
+ def initialize( config, appliance_config, plugin_config )
29
27
  @config = config
30
28
  @appliance_config = appliance_config
31
-
32
- aws_validator = AWSValidator.new( @config )
33
- aws_validator.validate_aws_config( @config.data['aws'] )
34
-
35
- @aws_data = @config.data['aws']
29
+ @plugin_config = plugin_config
36
30
 
37
31
  # remove dashes from account number
38
- @aws_data['account_number'] = @aws_data['account_number'].to_s.gsub(/-/, '')
32
+ @plugin_config['account_number'] = @plugin_config['account_number'].to_s.gsub(/-/, '')
39
33
 
40
- @ec2 = AWS::EC2::Base.new(:access_key_id => @aws_data['access_key'], :secret_access_key => @aws_data['secret_access_key'])
41
- @s3 = AWS::S3::Base.establish_connection!(:access_key_id => @aws_data['access_key'], :secret_access_key => @aws_data['secret_access_key'] )
34
+ @ec2 = AWS::EC2::Base.new(:access_key_id => @plugin_config['access_key'], :secret_access_key => @plugin_config['secret_access_key'])
35
+ @s3 = AWS::S3::Base.establish_connection!(:access_key_id => @plugin_config['access_key'], :secret_access_key => @plugin_config['secret_access_key'] )
42
36
  end
43
37
 
44
- attr_reader :aws_data
38
+ attr_reader :plugin_config
45
39
  attr_reader :ec2
46
40
  attr_reader :s3
47
41
 
48
42
  def bucket_key( appliance_name )
49
- "#{@aws_data['bucket_name']}/#{appliance_name}/#{@appliance_config.version}.#{@appliance_config.release}/#{@appliance_config.hardware.arch}"
43
+ "#{@plugin_config['bucket']}/#{appliance_name}/#{@appliance_config.version}.#{@appliance_config.release}/#{@appliance_config.hardware.arch}"
50
44
  end
51
45
 
52
46
  def bucket_manifest_key( appliance_name )
@@ -60,7 +54,7 @@ module BoxGrinder
60
54
  def ami_info( appliance_name )
61
55
  ami_info = nil
62
56
 
63
- images = @ec2.describe_images( :owner_id => @aws_data['account_number'] ).imagesSet
57
+ images = @ec2.describe_images( :owner_id => @plugin_config['account_number'] ).imagesSet
64
58
 
65
59
  return nil if images.nil?
66
60
 
@@ -27,6 +27,21 @@ include AWS::S3
27
27
  module BoxGrinder
28
28
  class S3Plugin < BaseDeliveryPlugin
29
29
 
30
+ AMI_OSES = {
31
+ 'fedora' => ["11"]
32
+ }
33
+
34
+ KERNELS = {
35
+ 'us_east' => {
36
+ 'fedora' => {
37
+ '11' => {
38
+ 'i386' => { :aki => 'aki-a71cf9ce', :ari => 'ari-a51cf9cc' },
39
+ 'x86_64' => { :aki => 'aki-b51cf9dc', :ari => 'ari-b31cf9da' }
40
+ }
41
+ }
42
+ }
43
+ }
44
+
30
45
  def info
31
46
  {
32
47
  :name => :s3,
@@ -37,10 +52,26 @@ module BoxGrinder
37
52
 
38
53
  def after_init
39
54
  set_default_config_value('overwrite', false)
55
+ set_default_config_value('path', '/')
56
+
57
+ @ami_build_dir = "#{@appliance_config.path.dir.build}/ec2/ami"
58
+ @ami_manifest = "#{@ami_build_dir}/#{@appliance_config.name}.ec2.manifest.xml"
40
59
  end
41
60
 
42
- def execute(deliverables, type = :ami)
43
- validate_plugin_config(['bucket', 'access_key', 'secret_access_key', 'path'])
61
+ def supported_os
62
+ supported = ""
63
+
64
+ AMI_OSES.each_key do |os_name|
65
+ supported << "#{os_name}, versions: #{AMI_OSES[os_name].join(", ")}"
66
+ end
67
+
68
+ supported
69
+ end
70
+
71
+ def execute( deliverables, type = :ami )
72
+ validate_plugin_config(['bucket', 'access_key', 'secret_access_key'])
73
+
74
+ @aws_helper = AWSHelper.new( @config, @appliance_config, @plugin_config )
44
75
 
45
76
  case type
46
77
  when :s3
@@ -48,16 +79,25 @@ module BoxGrinder
48
79
  when :cloudfront
49
80
  upload_to_bucket(deliverables, :public_read)
50
81
  when :ami
51
- raise "Not implemented!"
52
- #bundle_image(deliverables)
53
- #upload_image
54
- #register_image
82
+ validate_plugin_config(['cert_file', 'key_file'])
83
+
84
+ unless AMI_OSES[@appliance_config.os.name].include?(@appliance_config.os.version)
85
+ @log.error "You cannot convert selected image to AMI because of unsupported operating system: #{@appliance_config.os.name} #{@appliance_config.os.version}. Supported systems: #{supported_os}."
86
+ return
87
+ end
88
+
89
+ unless image_already_uploaded?
90
+ bundle_image( deliverables )
91
+ upload_image
92
+ else
93
+ @log.debug "AMI for #{@appliance_config.name} appliance already uploaded, skipping..."
94
+ end
95
+
96
+ register_image
55
97
  end
56
98
  end
57
99
 
58
100
  def upload_to_bucket(deliverables, permissions = :private)
59
- AWSHelper.new(@config, @appliance_config)
60
-
61
101
  package = PackageHelper.new(@config, @appliance_config, {:log => @log, :exec_helper => @exec_helper}).package(deliverables)
62
102
 
63
103
  @log.info "Uploading #{@appliance_config.name} appliance to S3 bucket '#{@plugin_config['bucket']}'..."
@@ -81,15 +121,19 @@ module BoxGrinder
81
121
  end
82
122
 
83
123
 
84
- def bundle_image(deliverables)
124
+ def bundle_image( deliverables )
125
+ return if File.exists?( @ami_build_dir )
126
+
85
127
  @log.info "Bundling AMI..."
86
128
 
87
- @exec_helper.execute("ec2-bundle-image -i #{deliverables[:disk]} --kernel #{AWS_DEFAULTS[:kernel_id][@appliance_config.hardware.arch]} --ramdisk #{AWS_DEFAULTS[:ramdisk_id][@appliance_config.hardware.arch]} -c #{@aws_helper.aws_data['cert_file']} -k #{@aws_helper.aws_data['key_file']} -u #{@aws_helper.aws_data['account_number']} -r #{@appliance_config.hardware.arch} -d #{@appliance_config.path.dir.ec2.bundle}")
129
+ FileUtils.mkdir_p( @ami_build_dir )
130
+
131
+ @exec_helper.execute("ec2-bundle-image -i #{deliverables[:disk]} --kernel #{KERNELS['us_east'][@appliance_config.os.name][@appliance_config.os.version][@appliance_config.hardware.arch][:aki]} --ramdisk #{KERNELS['us_east'][@appliance_config.os.name][@appliance_config.os.version][@appliance_config.hardware.arch][:ari]} -c #{@plugin_config['cert_file']} -k #{@plugin_config['key_file']} -u #{@plugin_config['account_number']} -r #{@appliance_config.hardware.arch} -d #{@ami_build_dir}")
88
132
 
89
133
  @log.info "Bundling AMI finished."
90
134
  end
91
135
 
92
- def appliance_already_uploaded?
136
+ def image_already_uploaded?
93
137
  begin
94
138
  bucket = Bucket.find(@aws_helper.aws_data['bucket_name'])
95
139
  rescue
@@ -107,14 +151,9 @@ module BoxGrinder
107
151
  end
108
152
 
109
153
  def upload_image
110
- if appliance_already_uploaded?
111
- @log.debug "Image for #{@appliance_config.name} appliance is already uploaded, skipping..."
112
- return
113
- end
114
-
115
- @log.info "Uploading #{@appliance_config.name} AMI to bucket '#{@aws_helper.aws_data['bucket_name']}'..."
154
+ @log.info "Uploading #{@appliance_config.name} AMI to bucket '#{@plugin_config['bucket']}'..."
116
155
 
117
- @exec_helper.execute("ec2-upload-bundle -b #{@aws_helper.bucket_key(@appliance_config.name)} -m #{@appliance_config.path.file.ec2.manifest} -a #{@aws_helper.aws_data['access_key']} -s #{@aws_helper.aws_data['secret_access_key']} --retry")
156
+ @exec_helper.execute("ec2-upload-bundle -b #{@aws_helper.bucket_key(@appliance_config.name)} -m #{@ami_manifest} -a #{@plugin_config['access_key']} -s #{@plugin_config['secret_access_key']} --retry")
118
157
  end
119
158
 
120
159
  def register_image
@@ -36,19 +36,17 @@ module BoxGrinder
36
36
  REGIONS = {'us_east' => 'url'}
37
37
 
38
38
  KERNELS = {
39
- 'us_east' => {
40
- 'fedora' => {
41
- '11' => {
42
- 'i386' => {:aki => 'aki-a71cf9ce', :ari => 'ari-a51cf9cc', :rpm => 'http://repo.oddthesis.org/packages/other/kernel-xen-2.6.21.7-2.fc8.i686.rpm'},
43
- 'x86_64' => {:aki => 'aki-b51cf9dc', :ari => 'ari-b31cf9da', :rpm => 'http://repo.oddthesis.org/packages/other/kernel-xen-2.6.21.7-2.fc8.x86_64.rpm'}
44
- }
39
+ 'fedora' => {
40
+ '11' => {
41
+ 'i386' => { :rpm => 'http://repo.oddthesis.org/packages/other/kernel-xen-2.6.21.7-2.fc8.i686.rpm' },
42
+ 'x86_64' => { :rpm => 'http://repo.oddthesis.org/packages/other/kernel-xen-2.6.21.7-2.fc8.x86_64.rpm' }
45
43
  }
46
44
  }
45
+
47
46
  }
48
47
 
49
48
  def after_init
50
49
  @deliverables[:disk] = "#{@appliance_config.path.dir.build}/ec2/#{@appliance_config.name}.ec2"
51
-
52
50
  end
53
51
 
54
52
  def supported_os
@@ -241,7 +239,7 @@ module BoxGrinder
241
239
  "ec2-ami-tools.noarch.rpm" => "http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm"
242
240
  }
243
241
 
244
- kernel_rpm = KERNELS['us_east'][@appliance_config.os.name][@appliance_config.os.version][@appliance_config.hardware.arch][:rpm]
242
+ kernel_rpm = KERNELS[@appliance_config.os.name][@appliance_config.os.version][@appliance_config.hardware.arch][:rpm]
245
243
  rpms[File.basename(kernel_rpm)] = kernel_rpm unless kernel_rpm.nil?
246
244
 
247
245
  cache_rpms(rpms)
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 2
9
- version: 0.3.2
8
+ - 3
9
+ version: 0.3.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - BoxGrinder Project
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-10 00:00:00 +02:00
17
+ date: 2010-05-20 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -27,8 +27,8 @@ dependencies:
27
27
  segments:
28
28
  - 0
29
29
  - 0
30
- - 6
31
- version: 0.0.6
30
+ - 8
31
+ version: 0.0.8
32
32
  type: :runtime
33
33
  version_requirements: *id001
34
34
  - !ruby/object:Gem::Dependency
@@ -176,7 +176,6 @@ files:
176
176
  - lib/boxgrinder-build/validators/ssh-validator.rb
177
177
  - lib/boxgrinder-build/validators/validator.rb
178
178
  - lib/boxgrinder-build/validators/config-validator.rb
179
- - lib/boxgrinder-build/validators/aws-validator.rb
180
179
  - lib/boxgrinder-build/appliance.rb
181
180
  - lib/boxgrinder-build/helpers/plugin-helper.rb
182
181
  - lib/boxgrinder-build/helpers/guestfs-helper.rb
@@ -1,51 +0,0 @@
1
- # JBoss, Home of Professional Open Source
2
- # Copyright 2009, Red Hat Middleware LLC, and individual contributors
3
- # by the @authors tag. See the copyright.txt in the distribution for a
4
- # full listing of individual contributors.
5
- #
6
- # This is free software; you can redistribute it and/or modify it
7
- # under the terms of the GNU Lesser General Public License as
8
- # published by the Free Software Foundation; either version 2.1 of
9
- # the License, or (at your option) any later version.
10
- #
11
- # This software is distributed in the hope that it will be useful,
12
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
- # Lesser General Public License for more details.
15
- #
16
- # You should have received a copy of the GNU Lesser General Public
17
- # License along with this software; if not, write to the Free
18
- # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19
- # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
20
-
21
- require 'boxgrinder-core/validators/errors'
22
-
23
- module BoxGrinder
24
- class AWSValidator
25
-
26
- def initialize( config )
27
- @config = config
28
- end
29
-
30
- def validate_aws_config( config )
31
- secure_permissions = "600"
32
-
33
- raise ValidationError, "Please specify aws section in configuration file (#{@config.config_file}). #{DEFAULT_HELP_TEXT[:general]}" if config.nil?
34
-
35
- raise ValidationError, "Please specify path to cert in aws section in configuration file (#{@config.config_file}). #{DEFAULT_HELP_TEXT[:general]}" if config['cert_file'].nil?
36
- raise ValidationError, "Certificate file '#{config['cert_file']}' specified in configuration file (#{@config.config_file}) doesn't exists. Please check your path. #{DEFAULT_HELP_TEXT[:general]}" unless File.exists?( config['cert_file'] )
37
- cert_permission = sprintf( "%o", File.stat( config['cert_file'] ).mode )[ 3, 5 ]
38
- raise ValidationError, "Certificate file '#{config['cert_file']}' specified in aws section in configuration file (#{@config.config_file}) has wrong permissions (#{cert_permission}), please correct it, run: 'chmod #{secure_permissions} #{config['cert_file']}'." unless cert_permission.eql?( secure_permissions )
39
-
40
- raise ValidationError, "Please specify path to private key in aws section in configuration file (#{@config.config_file}). #{DEFAULT_HELP_TEXT[:general]}" if config['key_file'].nil?
41
- raise ValidationError, "Private key file '#{config['key_file']}' specified in aws section in configuration file (#{@config.config_file}) doesn't exists. Please check your path." unless File.exists?( config['key_file'] )
42
- key_permission = sprintf( "%o", File.stat( config['key_file'] ).mode )[ 3, 5 ]
43
- raise ValidationError, "Private key file '#{config['key_file']}' specified in aws section in configuration file (#{@config.config_file}) has wrong permissions (#{key_permission}), please correct it, run: 'chmod #{secure_permissions} #{config['key_file']}'." unless key_permission.eql?( secure_permissions )
44
-
45
- raise ValidationError, "Please specify account number in aws section in configuration file (#{@config.config_file}). #{DEFAULT_HELP_TEXT[:general]}" if config['account_number'].nil?
46
- raise ValidationError, "Please specify access key in aws section in configuration file (#{@config.config_file}). #{DEFAULT_HELP_TEXT[:general]}" if config['access_key'].nil?
47
- raise ValidationError, "Please specify secret access key in aws section in configuration file (#{@config.config_file}). #{DEFAULT_HELP_TEXT[:general]}" if config['secret_access_key'].nil?
48
- raise ValidationError, "Please specify bucket name in in aws section in configuration file (#{@config.config_file})." if config['bucket_name'].nil? or config['bucket_name'].length == 0
49
- end
50
- end
51
- end