Class BoxGrinder::EC2Plugin
In: lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb
lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb
Parent: BasePlugin

Methods

Constants

REGIONS = {'us_east' => 'url'}
KERNELS = { 'centos' => { '5' => { 'i386' => {:rpm => 'http://repo.oddthesis.org/packages/other/kernel-xen-2.6.21.7-2.fc8.i686.rpm'}, 'x86_64' => {:rpm => 'http://repo.oddthesis.org/packages/other/kernel-xen-2.6.21.7-2.fc8.x86_64.rpm'}
REGIONS = {'us_east' => 'url'}
KERNELS = { 'centos' => { '5' => { 'i386' => {:rpm => 'http://repo.oddthesis.org/packages/other/kernel-xen-2.6.21.7-2.fc8.i686.rpm'}, 'x86_64' => {:rpm => 'http://repo.oddthesis.org/packages/other/kernel-xen-2.6.21.7-2.fc8.x86_64.rpm'}

Public Instance methods

issues.jboss.org/browse/BGBUILD-110

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 192
192:     def add_ec2_user(guestfs)
193:       @log.debug "Adding ec2-user user..."
194:       guestfs.sh("useradd ec2-user")
195:       guestfs.sh("echo -e 'ec2-user\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers")
196:       @log.debug "User ec2-user added."
197:     end

issues.jboss.org/browse/BGBUILD-110

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 192
192:     def add_ec2_user(guestfs)
193:       @log.debug "Adding ec2-user user..."
194:       guestfs.sh("useradd ec2-user")
195:       guestfs.sh("echo -e 'ec2-user\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers")
196:       @log.debug "User ec2-user added."
197:     end

[Source]

    # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 42
42:     def after_init
43:       register_deliverable(:disk => "#{@appliance_config.name}.ec2")
44: 
45:       register_supported_os('fedora', ['13', '14'])
46:       register_supported_os('centos', ['5'])
47:       register_supported_os('rhel', ['5'])
48:     end

[Source]

    # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 42
42:     def after_init
43:       register_deliverable(:disk => "#{@appliance_config.name}.ec2")
44: 
45:       register_supported_os('fedora', ['13', '14'])
46:       register_supported_os('centos', ['5'])
47:       register_supported_os('rhel', ['5'])
48:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 117
117:     def cache_rpms(rpms)
118:       for name in rpms.keys
119:         cache_file = "#{@config.dir.src_cache}/#{name}"
120: 
121:         @exec_helper.execute "mkdir -p #{@config.dir.src_cache}"
122:         @exec_helper.execute "wget #{rpms[name]} -O #{cache_file}" unless File.exist?(cache_file)
123:       end
124:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 117
117:     def cache_rpms(rpms)
118:       for name in rpms.keys
119:         cache_file = "#{@config.dir.src_cache}/#{name}"
120: 
121:         @exec_helper.execute "mkdir -p #{@config.dir.src_cache}"
122:         @exec_helper.execute "wget #{rpms[name]} -O #{cache_file}" unless File.exist?(cache_file)
123:       end
124:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 246
246:     def change_configuration(guestfs_helper)
247:       guestfs_helper.augeas do
248:         # disable password authentication
249:         set("/etc/ssh/sshd_config", "PasswordAuthentication", "no")
250: 
251:         # disable root login
252:         set("/etc/ssh/sshd_config", "PermitRootLogin", "no")
253:       end
254:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 246
246:     def change_configuration(guestfs_helper)
247:       guestfs_helper.augeas do
248:         # disable password authentication
249:         set("/etc/ssh/sshd_config", "PasswordAuthentication", "no")
250: 
251:         # disable root login
252:         set("/etc/ssh/sshd_config", "PermitRootLogin", "no")
253:       end
254:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 126
126:     def create_devices(guestfs)
127:       @log.debug "Creating required devices..."
128:       guestfs.sh("/sbin/MAKEDEV -d /dev -x console")
129:       guestfs.sh("/sbin/MAKEDEV -d /dev -x null")
130:       guestfs.sh("/sbin/MAKEDEV -d /dev -x zero")
131:       @log.debug "Devices created."
132:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 126
126:     def create_devices(guestfs)
127:       @log.debug "Creating required devices..."
128:       guestfs.sh("/sbin/MAKEDEV -d /dev -x console")
129:       guestfs.sh("/sbin/MAKEDEV -d /dev -x null")
130:       guestfs.sh("/sbin/MAKEDEV -d /dev -x zero")
131:       @log.debug "Devices created."
132:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 134
134:     def disk_device_prefix
135:       disk = 's'
136: 
137:       case @appliance_config.os.name
138:         when 'fedora'
139:           disk = 'xv' if @appliance_config.os.version != '11'
140:       end
141: 
142:       disk
143:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 134
134:     def disk_device_prefix
135:       disk = 's'
136: 
137:       case @appliance_config.os.name
138:         when 'fedora'
139:           disk = 'xv' if @appliance_config.os.version != '11'
140:       end
141: 
142:       disk
143:     end

enable networking on default runlevels

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 200
200:     def enable_networking(guestfs)
201:       @log.debug "Enabling networking..."
202:       guestfs.sh("/sbin/chkconfig network on")
203:       guestfs.upload("#{File.dirname(__FILE__)}/src/ifcfg-eth0", "/etc/sysconfig/network-scripts/ifcfg-eth0")
204:       @log.debug "Networking enabled."
205:     end

enable networking on default runlevels

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 200
200:     def enable_networking(guestfs)
201:       @log.debug "Enabling networking..."
202:       guestfs.sh("/sbin/chkconfig network on")
203:       guestfs.upload("#{File.dirname(__FILE__)}/src/ifcfg-eth0", "/etc/sysconfig/network-scripts/ifcfg-eth0")
204:       @log.debug "Networking enabled."
205:     end

This fixes issues with Fedora 14 on EC2: bugzilla.redhat.com/show_bug.cgi?id=651861#c39

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 184
184:     def enable_nosegneg_flag(guestfs)
185:       @log.debug "Enabling nosegneg flag..."
186:       guestfs.sh("echo \"hwcap 1 nosegneg\" > /etc/ld.so.conf.d/libc6-xen.conf")
187:       guestfs.sh("/sbin/ldconfig")
188:       @log.debug "Nosegneg enabled."
189:     end

This fixes issues with Fedora 14 on EC2: bugzilla.redhat.com/show_bug.cgi?id=651861#c39

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 184
184:     def enable_nosegneg_flag(guestfs)
185:       @log.debug "Enabling nosegneg flag..."
186:       guestfs.sh("echo \"hwcap 1 nosegneg\" > /etc/ld.so.conf.d/libc6-xen.conf")
187:       guestfs.sh("/sbin/ldconfig")
188:       @log.debug "Nosegneg enabled."
189:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 50
 50:     def execute
 51:       unless is_supported_os?
 52:         @log.error "EC2 delivery plugin supports following operating systems: #{supported_oses}. Your OS is #{@appliance_config.os.name} #{@appliance_config.os.version}."
 53:         return
 54:       end
 55: 
 56:       @linux_helper = LinuxHelper.new(:log => @log)
 57: 
 58:       @log.info "Converting #{@appliance_config.name} appliance image to EC2 format..."
 59: 
 60:       begin
 61:         # TODO using whole 10GB is fine?
 62:         @image_helper.create_disk(@deliverables.disk, 10)
 63:         @image_helper.create_filesystem(@deliverables.disk)
 64:       rescue => e
 65:         @log.error "Error while preparing EC2 disk image. See logs for more info"
 66:         raise e
 67:       end
 68: 
 69:       ec2_disk_mount_dir = "#{@dir.tmp}/ec2-#{rand(9999999999).to_s.center(10, rand(9).to_s)}"
 70:       raw_disk_mount_dir = "#{@dir.tmp}/raw-#{rand(9999999999).to_s.center(10, rand(9).to_s)}"
 71: 
 72:       begin
 73:         ec2_mounts = @image_helper.mount_image(@deliverables.disk, ec2_disk_mount_dir)
 74:         raw_mounts = @image_helper.mount_image(@previous_deliverables.disk, raw_disk_mount_dir)
 75:       rescue => e
 76:         @log.debug e
 77:         raise "Error while mounting image. See logs for more info"
 78:       end
 79: 
 80:       @image_helper.sync_files(raw_disk_mount_dir, ec2_disk_mount_dir)
 81: 
 82:       @image_helper.umount_image(@previous_deliverables.disk, raw_disk_mount_dir, raw_mounts)
 83:       @image_helper.umount_image(@deliverables.disk, ec2_disk_mount_dir, ec2_mounts)
 84: 
 85:       @image_helper.customize(@deliverables.disk) do |guestfs, guestfs_helper|
 86:         # TODO is this really needed?
 87:         @log.debug "Uploading '/etc/resolv.conf'..."
 88:         guestfs.upload("/etc/resolv.conf", "/etc/resolv.conf")
 89:         @log.debug "'/etc/resolv.conf' uploaded."
 90: 
 91:         create_devices(guestfs)
 92:         upload_fstab(guestfs)
 93: 
 94:         guestfs.mkdir("/data") if @appliance_config.is64bit?
 95: 
 96:         enable_networking(guestfs)
 97:         upload_rc_local(guestfs)
 98:         enable_nosegneg_flag(guestfs)
 99:         add_ec2_user(guestfs)
100:         install_additional_packages(guestfs)
101:         change_configuration(guestfs_helper)
102:         install_menu_lst(guestfs)
103: 
104:         unless @appliance_config.post['ec2'].nil?
105:           @appliance_config.post['ec2'].each do |cmd|
106:             guestfs_helper.sh(cmd, :arch => @appliance_config.hardware.arch)
107:           end
108:           @log.debug "Post commands from appliance definition file executed."
109:         else
110:           @log.debug "No commands specified, skipping."
111:         end
112:       end
113: 
114:       @log.info "Image converted to EC2 format."
115:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 50
 50:     def execute
 51:       unless is_supported_os?
 52:         @log.error "EC2 delivery plugin supports following operating systems: #{supported_oses}. Your OS is #{@appliance_config.os.name} #{@appliance_config.os.version}."
 53:         return
 54:       end
 55: 
 56:       @linux_helper = LinuxHelper.new(:log => @log)
 57: 
 58:       @log.info "Converting #{@appliance_config.name} appliance image to EC2 format..."
 59: 
 60:       begin
 61:         # TODO using whole 10GB is fine?
 62:         @image_helper.create_disk(@deliverables.disk, 10)
 63:         @image_helper.create_filesystem(@deliverables.disk)
 64:       rescue => e
 65:         @log.error "Error while preparing EC2 disk image. See logs for more info"
 66:         raise e
 67:       end
 68: 
 69:       ec2_disk_mount_dir = "#{@dir.tmp}/ec2-#{rand(9999999999).to_s.center(10, rand(9).to_s)}"
 70:       raw_disk_mount_dir = "#{@dir.tmp}/raw-#{rand(9999999999).to_s.center(10, rand(9).to_s)}"
 71: 
 72:       begin
 73:         ec2_mounts = @image_helper.mount_image(@deliverables.disk, ec2_disk_mount_dir)
 74:         raw_mounts = @image_helper.mount_image(@previous_deliverables.disk, raw_disk_mount_dir)
 75:       rescue => e
 76:         @log.debug e
 77:         raise "Error while mounting image. See logs for more info"
 78:       end
 79: 
 80:       @image_helper.sync_files(raw_disk_mount_dir, ec2_disk_mount_dir)
 81: 
 82:       @image_helper.umount_image(@previous_deliverables.disk, raw_disk_mount_dir, raw_mounts)
 83:       @image_helper.umount_image(@deliverables.disk, ec2_disk_mount_dir, ec2_mounts)
 84: 
 85:       @image_helper.customize(@deliverables.disk) do |guestfs, guestfs_helper|
 86:         # TODO is this really needed?
 87:         @log.debug "Uploading '/etc/resolv.conf'..."
 88:         guestfs.upload("/etc/resolv.conf", "/etc/resolv.conf")
 89:         @log.debug "'/etc/resolv.conf' uploaded."
 90: 
 91:         create_devices(guestfs)
 92:         upload_fstab(guestfs)
 93: 
 94:         guestfs.mkdir("/data") if @appliance_config.is64bit?
 95: 
 96:         enable_networking(guestfs)
 97:         upload_rc_local(guestfs)
 98:         enable_nosegneg_flag(guestfs)
 99:         add_ec2_user(guestfs)
100:         install_additional_packages(guestfs)
101:         change_configuration(guestfs_helper)
102:         install_menu_lst(guestfs)
103: 
104:         unless @appliance_config.post['ec2'].nil?
105:           @appliance_config.post['ec2'].each do |cmd|
106:             guestfs_helper.sh(cmd, :arch => @appliance_config.hardware.arch)
107:           end
108:           @log.debug "Post commands from appliance definition file executed."
109:         else
110:           @log.debug "No commands specified, skipping."
111:         end
112:       end
113: 
114:       @log.info "Image converted to EC2 format."
115:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 219
219:     def install_additional_packages(guestfs)
220:       rpms = {}
221: 
222:       begin
223:         kernel_rpm = KERNELS[@appliance_config.os.name][@appliance_config.os.version][@appliance_config.hardware.base_arch][:rpm]
224:         rpms[File.basename(kernel_rpm)] = kernel_rpm
225:       rescue
226:       end
227: 
228:       return if rpms.empty?
229: 
230:       cache_rpms(rpms)
231: 
232:       @log.debug "Installing additional packages (#{rpms.keys.join(", ")})..."
233:       guestfs.mkdir_p("/tmp/rpms")
234: 
235:       for name in rpms.keys
236:         cache_file = "#{@config.dir.src_cache}/#{name}"
237:         guestfs.upload(cache_file, "/tmp/rpms/#{name}")
238:       end
239: 
240:       guestfs.sh("rpm -ivh --nodeps /tmp/rpms/*.rpm")
241:       guestfs.rm_rf("/tmp/rpms")
242: 
243:       @log.debug "Additional packages installed."
244:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 219
219:     def install_additional_packages(guestfs)
220:       rpms = {}
221: 
222:       begin
223:         kernel_rpm = KERNELS[@appliance_config.os.name][@appliance_config.os.version][@appliance_config.hardware.base_arch][:rpm]
224:         rpms[File.basename(kernel_rpm)] = kernel_rpm
225:       rescue
226:       end
227: 
228:       return if rpms.empty?
229: 
230:       cache_rpms(rpms)
231: 
232:       @log.debug "Installing additional packages (#{rpms.keys.join(", ")})..."
233:       guestfs.mkdir_p("/tmp/rpms")
234: 
235:       for name in rpms.keys
236:         cache_file = "#{@config.dir.src_cache}/#{name}"
237:         guestfs.upload(cache_file, "/tmp/rpms/#{name}")
238:       end
239: 
240:       guestfs.sh("rpm -ivh --nodeps /tmp/rpms/*.rpm")
241:       guestfs.rm_rf("/tmp/rpms")
242: 
243:       @log.debug "Additional packages installed."
244:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 164
164:     def install_menu_lst(guestfs)
165:       @log.debug "Uploading '/boot/grub/menu.lst' file..."
166:       menu_lst_data = File.open("#{File.dirname(__FILE__)}/src/menu.lst").read
167: 
168:       menu_lst_data.gsub!(/#TITLE#/, @appliance_config.name)
169:       menu_lst_data.gsub!(/#KERNEL_VERSION#/, @linux_helper.kernel_version(guestfs))
170:       menu_lst_data.gsub!(/#KERNEL_IMAGE_NAME#/, @linux_helper.kernel_image_name(guestfs))
171:       menu_lst_data.gsub!(/#DISK_DEVICE_PREFIX#/, disk_device_prefix)
172: 
173:       menu_lst = Tempfile.new('menu_lst')
174:       menu_lst << menu_lst_data
175:       menu_lst.flush
176: 
177:       guestfs.upload(menu_lst.path, "/boot/grub/menu.lst")
178: 
179:       menu_lst.close
180:       @log.debug "'/boot/grub/menu.lst' file uploaded."
181:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 164
164:     def install_menu_lst(guestfs)
165:       @log.debug "Uploading '/boot/grub/menu.lst' file..."
166:       menu_lst_data = File.open("#{File.dirname(__FILE__)}/src/menu.lst").read
167: 
168:       menu_lst_data.gsub!(/#TITLE#/, @appliance_config.name)
169:       menu_lst_data.gsub!(/#KERNEL_VERSION#/, @linux_helper.kernel_version(guestfs))
170:       menu_lst_data.gsub!(/#KERNEL_IMAGE_NAME#/, @linux_helper.kernel_image_name(guestfs))
171:       menu_lst_data.gsub!(/#DISK_DEVICE_PREFIX#/, disk_device_prefix)
172: 
173:       menu_lst = Tempfile.new('menu_lst')
174:       menu_lst << menu_lst_data
175:       menu_lst.flush
176: 
177:       guestfs.upload(menu_lst.path, "/boot/grub/menu.lst")
178: 
179:       menu_lst.close
180:       @log.debug "'/boot/grub/menu.lst' file uploaded."
181:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 145
145:     def upload_fstab(guestfs)
146:       @log.debug "Uploading '/etc/fstab' file..."
147: 
148:       fstab_file = @appliance_config.is64bit? ? "#{File.dirname(__FILE__)}/src/fstab_64bit" : "#{File.dirname(__FILE__)}/src/fstab_32bit"
149: 
150:       fstab_data = File.open(fstab_file).read
151:       fstab_data.gsub!(/#DISK_DEVICE_PREFIX#/, disk_device_prefix)
152: 
153:       fstab = Tempfile.new('fstab')
154:       fstab << fstab_data
155:       fstab.flush
156: 
157:       guestfs.upload(fstab.path, "/etc/fstab")
158: 
159:       fstab.close
160: 
161:       @log.debug "'/etc/fstab' file uploaded."
162:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 145
145:     def upload_fstab(guestfs)
146:       @log.debug "Uploading '/etc/fstab' file..."
147: 
148:       fstab_file = @appliance_config.is64bit? ? "#{File.dirname(__FILE__)}/src/fstab_64bit" : "#{File.dirname(__FILE__)}/src/fstab_32bit"
149: 
150:       fstab_data = File.open(fstab_file).read
151:       fstab_data.gsub!(/#DISK_DEVICE_PREFIX#/, disk_device_prefix)
152: 
153:       fstab = Tempfile.new('fstab')
154:       fstab << fstab_data
155:       fstab.flush
156: 
157:       guestfs.upload(fstab.path, "/etc/fstab")
158: 
159:       fstab.close
160: 
161:       @log.debug "'/etc/fstab' file uploaded."
162:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 207
207:     def upload_rc_local(guestfs)
208:       @log.debug "Uploading '/etc/rc.local' file..."
209:       rc_local = Tempfile.new('rc_local')
210:       rc_local << guestfs.read_file("/etc/rc.local") + File.read("#{File.dirname(__FILE__)}/src/rc_local")
211:       rc_local.flush
212: 
213:       guestfs.upload(rc_local.path, "/etc/rc.local")
214: 
215:       rc_local.close
216:       @log.debug "'/etc/rc.local' file uploaded."
217:     end

[Source]

     # File lib/boxgrinder-build-ec2-platform-plugin/ec2-plugin.rb, line 207
207:     def upload_rc_local(guestfs)
208:       @log.debug "Uploading '/etc/rc.local' file..."
209:       rc_local = Tempfile.new('rc_local')
210:       rc_local << guestfs.read_file("/etc/rc.local") + File.read("#{File.dirname(__FILE__)}/src/rc_local")
211:       rc_local.flush
212: 
213:       guestfs.upload(rc_local.path, "/etc/rc.local")
214: 
215:       rc_local.close
216:       @log.debug "'/etc/rc.local' file uploaded."
217:     end

[Validate]