Class BoxGrinder::S3Plugin
In: lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb
lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb
Parent: BasePlugin

Methods

Constants

AMI_OSES = { 'fedora' => [ '13', '14' ], 'centos' => [ '5' ], 'rhel' => [ '5' ]
KERNELS = { 'us_east' => { 'fedora' => { '14' => { 'i386' => { :aki => 'aki-407d9529' }, 'x86_64' => { :aki => 'aki-427d952b' }
AMI_OSES = { 'fedora' => [ '13', '14' ], 'centos' => [ '5' ], 'rhel' => [ '5' ]
KERNELS = { 'us_east' => { 'fedora' => { '14' => { 'i386' => { :aki => 'aki-407d9529' }, 'x86_64' => { :aki => 'aki-427d952b' }

Public Instance methods

[Source]

    # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 61
61:     def after_init
62:       set_default_config_value('overwrite', false)
63:       set_default_config_value('path', '/')
64:       set_default_config_value('url', 'http://s3.amazonaws.com')
65: 
66:       @ami_build_dir  = "#{@dir.base}/ami"
67:       @ami_manifest   = "#{@ami_build_dir}/#{@appliance_config.name}.ec2.manifest.xml"
68:     end

[Source]

    # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 61
61:     def after_init
62:       set_default_config_value('overwrite', false)
63:       set_default_config_value('path', '/')
64:       set_default_config_value('url', 'http://s3.amazonaws.com')
65: 
66:       @ami_build_dir  = "#{@dir.base}/ami"
67:       @ami_manifest   = "#{@ami_build_dir}/#{@appliance_config.name}.ec2.manifest.xml"
68:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 220
220:     def ami_bucket_key( appliance_name, path )
221:       "#{@plugin_config['bucket']}#{s3_path( path )}#{appliance_name}/#{@appliance_config.os.name}/#{@appliance_config.os.version}/#{@appliance_config.version}.#{@appliance_config.release}/#{@appliance_config.hardware.arch}"
222:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 220
220:     def ami_bucket_key( appliance_name, path )
221:       "#{@plugin_config['bucket']}#{s3_path( path )}#{appliance_name}/#{@appliance_config.os.name}/#{@appliance_config.os.version}/#{@appliance_config.version}.#{@appliance_config.release}/#{@appliance_config.hardware.arch}"
222:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 200
200:     def ami_info( appliance_name, path )
201:       ami_info = nil
202: 
203:       images = @ec2.describe_images( :owner_id => @plugin_config['account_number'] ).imagesSet
204: 
205:       return nil if images.nil?
206: 
207:       for image in images.item do
208:         ami_info = image if (image.imageLocation.eql?( bucket_manifest_key( appliance_name, path ) ))
209:       end
210: 
211:       ami_info
212:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 200
200:     def ami_info( appliance_name, path )
201:       ami_info = nil
202: 
203:       images = @ec2.describe_images( :owner_id => @plugin_config['account_number'] ).imagesSet
204: 
205:       return nil if images.nil?
206: 
207:       for image in images.item do
208:         ami_info = image if (image.imageLocation.eql?( bucket_manifest_key( appliance_name, path ) ))
209:       end
210: 
211:       ami_info
212:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 224
224:     def bucket_manifest_key( appliance_name, path )
225:       "#{ami_bucket_key( appliance_name, path )}/#{appliance_name}.ec2.manifest.xml"
226:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 224
224:     def bucket_manifest_key( appliance_name, path )
225:       "#{ami_bucket_key( appliance_name, path )}/#{appliance_name}.ec2.manifest.xml"
226:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 151
151:     def bundle_image( deliverables )
152:       return if File.exists?( @ami_build_dir )
153: 
154:       @log.info "Bundling AMI..."
155: 
156:       FileUtils.mkdir_p( @ami_build_dir )
157: 
158:       aki = "--kernel #{KERNELS['us_east'][@appliance_config.os.name][@appliance_config.os.version][@appliance_config.hardware.base_arch][:aki]}"
159:       ari = KERNELS['us_east'][@appliance_config.os.name][@appliance_config.os.version][@appliance_config.hardware.base_arch][:ari].nil? ? "" : "--ramdisk #{KERNELS['us_east'][@appliance_config.os.name][@appliance_config.os.version][@appliance_config.hardware.base_arch][:ari]}"
160: 
161:       @exec_helper.execute("euca-bundle-image --ec2cert #{File.dirname(__FILE__)}/src/cert-ec2.pem -i #{deliverables[:disk]} #{aki} #{ari} -c #{@plugin_config['cert_file']} -k #{@plugin_config['key_file']} -u #{@plugin_config['account_number']} -r #{@appliance_config.hardware.base_arch} -d #{@ami_build_dir}")
162: 
163:       @log.info "Bundling AMI finished."
164:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 151
151:     def bundle_image( deliverables )
152:       return if File.exists?( @ami_build_dir )
153: 
154:       @log.info "Bundling AMI..."
155: 
156:       FileUtils.mkdir_p( @ami_build_dir )
157: 
158:       aki = "--kernel #{KERNELS['us_east'][@appliance_config.os.name][@appliance_config.os.version][@appliance_config.hardware.base_arch][:aki]}"
159:       ari = KERNELS['us_east'][@appliance_config.os.name][@appliance_config.os.version][@appliance_config.hardware.base_arch][:ari].nil? ? "" : "--ramdisk #{KERNELS['us_east'][@appliance_config.os.name][@appliance_config.os.version][@appliance_config.hardware.base_arch][:ari]}"
160: 
161:       @exec_helper.execute("euca-bundle-image --ec2cert #{File.dirname(__FILE__)}/src/cert-ec2.pem -i #{deliverables[:disk]} #{aki} #{ari} -c #{@plugin_config['cert_file']} -k #{@plugin_config['key_file']} -u #{@plugin_config['account_number']} -r #{@appliance_config.hardware.base_arch} -d #{@ami_build_dir}")
162: 
163:       @log.info "Bundling AMI finished."
164:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 81
 81:     def execute( type = :ami )
 82:       validate_plugin_config(['bucket', 'access_key', 'secret_access_key'], 'http://community.jboss.org/docs/DOC-15217')
 83: 
 84:       case type
 85:         when :s3
 86:           upload_to_bucket(@previous_deliverables)
 87:         when :cloudfront
 88:           upload_to_bucket(@previous_deliverables, 'public-read')
 89:         when :ami
 90:           validate_plugin_config(['cert_file', 'key_file', 'account_number'], 'http://community.jboss.org/docs/DOC-15217')
 91: 
 92:           @plugin_config['account_number'] = @plugin_config['account_number'].to_s.gsub(/-/, '')
 93: 
 94:           @ec2 = AWS::EC2::Base.new(:access_key_id => @plugin_config['access_key'], :secret_access_key => @plugin_config['secret_access_key'])
 95: 
 96:           unless AMI_OSES[@appliance_config.os.name].include?(@appliance_config.os.version)
 97:             @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}."
 98:             return
 99:           end
100: 
101:           unless image_already_uploaded?
102:             bundle_image( @previous_deliverables )
103:             fix_sha1_sum
104:             upload_image
105:           else
106:             @log.debug "AMI for #{@appliance_config.name} appliance already uploaded, skipping..."
107:           end
108: 
109:           register_image
110:       end
111:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 81
 81:     def execute( type = :ami )
 82:       validate_plugin_config(['bucket', 'access_key', 'secret_access_key'], 'http://community.jboss.org/docs/DOC-15217')
 83: 
 84:       case type
 85:         when :s3
 86:           upload_to_bucket(@previous_deliverables)
 87:         when :cloudfront
 88:           upload_to_bucket(@previous_deliverables, 'public-read')
 89:         when :ami
 90:           validate_plugin_config(['cert_file', 'key_file', 'account_number'], 'http://community.jboss.org/docs/DOC-15217')
 91: 
 92:           @plugin_config['account_number'] = @plugin_config['account_number'].to_s.gsub(/-/, '')
 93: 
 94:           @ec2 = AWS::EC2::Base.new(:access_key_id => @plugin_config['access_key'], :secret_access_key => @plugin_config['secret_access_key'])
 95: 
 96:           unless AMI_OSES[@appliance_config.os.name].include?(@appliance_config.os.version)
 97:             @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}."
 98:             return
 99:           end
100: 
101:           unless image_already_uploaded?
102:             bundle_image( @previous_deliverables )
103:             fix_sha1_sum
104:             upload_image
105:           else
106:             @log.debug "AMI for #{@appliance_config.name} appliance already uploaded, skipping..."
107:           end
108: 
109:           register_image
110:       end
111:     end

jira.jboss.org/browse/BGBUILD-34

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 114
114:     def fix_sha1_sum
115:       ami_manifest = File.open( @ami_manifest ).read
116:       ami_manifest.gsub!( '(stdin)= ', '' )
117: 
118:       File.open( @ami_manifest, "w" ) {|f| f.write( ami_manifest ) }
119:     end

jira.jboss.org/browse/BGBUILD-34

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 114
114:     def fix_sha1_sum
115:       ami_manifest = File.open( @ami_manifest ).read
116:       ami_manifest.gsub!( '(stdin)= ', '' )
117: 
118:       File.open( @ami_manifest, "w" ) {|f| f.write( ami_manifest ) }
119:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 166
166:     def image_already_uploaded?
167: 
168:       begin
169:         bucket = @s3.bucket( @plugin_config['bucket'] )
170:         bucket.keys
171:       rescue
172:         return false
173:       end
174: 
175:       manifest_location = bucket_manifest_key(@appliance_config.name, @plugin_config['path'])
176:       manifest_location = manifest_location[manifest_location.index("/") + 1, manifest_location.length]
177: 
178:       return true if bucket.key( manifest_location ).exists?
179: 
180:       false
181:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 166
166:     def image_already_uploaded?
167: 
168:       begin
169:         bucket = @s3.bucket( @plugin_config['bucket'] )
170:         bucket.keys
171:       rescue
172:         return false
173:       end
174: 
175:       manifest_location = bucket_manifest_key(@appliance_config.name, @plugin_config['path'])
176:       manifest_location = manifest_location[manifest_location.index("/") + 1, manifest_location.length]
177: 
178:       return true if bucket.key( manifest_location ).exists?
179: 
180:       false
181:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 189
189:     def register_image
190:       info  = ami_info(@appliance_config.name, @plugin_config['path'])
191: 
192:       if info
193:         @log.info "Image is registered under id: #{info.imageId}"
194:       else
195:         info = @ec2.register_image(:image_location => bucket_manifest_key(@appliance_config.name, @plugin_config['path']))
196:         @log.info "Image successfully registered under id: #{info.imageId}."
197:       end
198:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 189
189:     def register_image
190:       info  = ami_info(@appliance_config.name, @plugin_config['path'])
191: 
192:       if info
193:         @log.info "Image is registered under id: #{info.imageId}"
194:       else
195:         info = @ec2.register_image(:image_location => bucket_manifest_key(@appliance_config.name, @plugin_config['path']))
196:         @log.info "Image successfully registered under id: #{info.imageId}."
197:       end
198:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 214
214:     def s3_path( path )
215:       return path if path == '/'
216: 
217:       "/#{path.gsub(/^(\/)*/, '').gsub(/(\/)*$/, '')}/"
218:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 214
214:     def s3_path( path )
215:       return path if path == '/'
216: 
217:       "/#{path.gsub(/^(\/)*/, '').gsub(/(\/)*$/, '')}/"
218:     end

TODO: remove this from here, use base-plugin os info

[Source]

    # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 71
71:     def supported_os
72:       supported = ""
73: 
74:       AMI_OSES.each_key do |os_name|
75:         supported << "#{os_name}, versions: #{AMI_OSES[os_name].join(", ")}"
76:       end
77: 
78:       supported
79:     end

TODO: remove this from here, use base-plugin os info

[Source]

    # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 71
71:     def supported_os
72:       supported = ""
73: 
74:       AMI_OSES.each_key do |os_name|
75:         supported << "#{os_name}, versions: #{AMI_OSES[os_name].join(", ")}"
76:       end
77: 
78:       supported
79:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 183
183:     def upload_image
184:       @log.info "Uploading #{@appliance_config.name} AMI to bucket '#{@plugin_config['bucket']}'..."
185: 
186:       @exec_helper.execute("euca-upload-bundle -U #{@plugin_config['url']} -b #{ami_bucket_key(@appliance_config.name, @plugin_config['path'])} -m #{@ami_manifest} -a #{@plugin_config['access_key']} -s #{@plugin_config['secret_access_key']}")
187:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 183
183:     def upload_image
184:       @log.info "Uploading #{@appliance_config.name} AMI to bucket '#{@plugin_config['bucket']}'..."
185: 
186:       @exec_helper.execute("euca-upload-bundle -U #{@plugin_config['url']} -b #{ami_bucket_key(@appliance_config.name, @plugin_config['path'])} -m #{@ami_manifest} -a #{@plugin_config['access_key']} -s #{@plugin_config['secret_access_key']}")
187:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 121
121:     def upload_to_bucket(previous_deliverables, permissions = 'private')
122:       register_deliverable(
123:           :package => "#{@appliance_config.name}-#{@appliance_config.version}.#{@appliance_config.release}-#{@appliance_config.os.name}-#{@appliance_config.os.version}-#{@appliance_config.hardware.arch}-#{current_platform}.tgz"
124:       )
125: 
126:       # quick and dirty workaround to use @deliverables[:package] later in code
127:       FileUtils.mv( @target_deliverables[:package], @deliverables[:package] ) if File.exists?( @target_deliverables[:package] )
128: 
129:       PackageHelper.new(@config, @appliance_config, @dir, {:log => @log, :exec_helper => @exec_helper}).package( File.dirname(previous_deliverables[:disk]), @deliverables[:package] )
130: 
131:       @s3 = Aws::S3.new( @plugin_config['access_key'], @plugin_config['secret_access_key'], :connection_mode => :single, :logger => @log )
132: 
133:       bucket = @s3.bucket( @plugin_config['bucket'], true )
134: 
135:       remote_path = "#{s3_path( @plugin_config['path'] )}#{File.basename(@deliverables[:package])}"
136:       size_b      = File.size(@deliverables[:package])
137: 
138:       key = bucket.key( remote_path.gsub(/^\//, '').gsub(/\/\//, '') )
139: 
140:       unless key.exists? or @plugin_config['overwrite']
141:         @log.info "Uploading #{File.basename(@deliverables[:package])} (#{size_b/1024/1024}MB) to '#{@plugin_config['bucket']}#{remote_path}' path..."
142:         key.put( open(@deliverables[:package]), permissions )
143:         @log.info "Appliance #{@appliance_config.name} uploaded to S3."
144:       else
145:         @log.info "File '#{@plugin_config['bucket']}#{remote_path}' already uploaded, skipping."
146:       end
147: 
148:       @s3.close_connection
149:     end

[Source]

     # File lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb, line 121
121:     def upload_to_bucket(previous_deliverables, permissions = 'private')
122:       register_deliverable(
123:           :package => "#{@appliance_config.name}-#{@appliance_config.version}.#{@appliance_config.release}-#{@appliance_config.os.name}-#{@appliance_config.os.version}-#{@appliance_config.hardware.arch}-#{current_platform}.tgz"
124:       )
125: 
126:       # quick and dirty workaround to use @deliverables[:package] later in code
127:       FileUtils.mv( @target_deliverables[:package], @deliverables[:package] ) if File.exists?( @target_deliverables[:package] )
128: 
129:       PackageHelper.new(@config, @appliance_config, @dir, {:log => @log, :exec_helper => @exec_helper}).package( File.dirname(previous_deliverables[:disk]), @deliverables[:package] )
130: 
131:       @s3 = Aws::S3.new( @plugin_config['access_key'], @plugin_config['secret_access_key'], :connection_mode => :single, :logger => @log )
132: 
133:       bucket = @s3.bucket( @plugin_config['bucket'], true )
134: 
135:       remote_path = "#{s3_path( @plugin_config['path'] )}#{File.basename(@deliverables[:package])}"
136:       size_b      = File.size(@deliverables[:package])
137: 
138:       key = bucket.key( remote_path.gsub(/^\//, '').gsub(/\/\//, '') )
139: 
140:       unless key.exists? or @plugin_config['overwrite']
141:         @log.info "Uploading #{File.basename(@deliverables[:package])} (#{size_b/1024/1024}MB) to '#{@plugin_config['bucket']}#{remote_path}' path..."
142:         key.put( open(@deliverables[:package]), permissions )
143:         @log.info "Appliance #{@appliance_config.name} uploaded to S3."
144:       else
145:         @log.info "File '#{@plugin_config['bucket']}#{remote_path}' already uploaded, skipping."
146:       end
147: 
148:       @s3.close_connection
149:     end

[Validate]