| Class | BoxGrinder::S3Plugin |
| In: |
lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb
lib/boxgrinder-build-s3-delivery-plugin/s3-plugin.rb |
| Parent: | BasePlugin |
| 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' } |
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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