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