Class | BoxGrinder::VMwarePlugin |
In: |
lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb
lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb |
Parent: | BasePlugin |
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 23 23: def after_init 24: set_default_config_value('thin_disk', false) 25: validate_plugin_config(['type'], 'http://boxgrinder.org/tutorials/boxgrinder-build-plugins/#VMware_Platform_Plugin') 26: 27: register_deliverable(:vmx => "#{@appliance_config.name}.vmx", 28: :readme => "README") 29: 30: if @plugin_config['type'].eql?('personal') and @plugin_config['thin_disk'] 31: register_deliverable(:disk => "#{@appliance_config.name}.vmdk") 32: else 33: register_deliverable(:disk => "#{@appliance_config.name}.raw", 34: :vmdk => "#{@appliance_config.name}.vmdk") 35: end 36: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 23 23: def after_init 24: set_default_config_value('thin_disk', false) 25: validate_plugin_config(['type'], 'http://boxgrinder.org/tutorials/boxgrinder-build-plugins/#VMware_Platform_Plugin') 26: 27: register_deliverable(:vmx => "#{@appliance_config.name}.vmx", 28: :readme => "README") 29: 30: if @plugin_config['type'].eql?('personal') and @plugin_config['thin_disk'] 31: register_deliverable(:disk => "#{@appliance_config.name}.vmdk") 32: else 33: register_deliverable(:disk => "#{@appliance_config.name}.raw", 34: :vmdk => "#{@appliance_config.name}.vmdk") 35: end 36: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 171 171: def build_vmware_enterprise 172: @log.debug "Building VMware enterprise image." 173: 174: copy_raw_image 175: 176: # defaults for ESXi (maybe for others too) 177: @appliance_config.hardware.network = "VM Network" if @appliance_config.hardware.network.eql?("NAT") 178: 179: # create .vmx file 180: vmx_data = change_common_vmx_values 181: vmx_data += "ethernet0.networkName = \"#{@appliance_config.hardware.network}\"" 182: 183: File.open(@deliverables.vmx, "w") { |f| f.write(vmx_data) } 184: 185: # create disk descriptor file 186: File.open(@deliverables.vmdk, "w") { |f| f.write(change_vmdk_values("vmfs")) } 187: 188: @log.debug "VMware enterprise image was built." 189: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 171 171: def build_vmware_enterprise 172: @log.debug "Building VMware enterprise image." 173: 174: copy_raw_image 175: 176: # defaults for ESXi (maybe for others too) 177: @appliance_config.hardware.network = "VM Network" if @appliance_config.hardware.network.eql?("NAT") 178: 179: # create .vmx file 180: vmx_data = change_common_vmx_values 181: vmx_data += "ethernet0.networkName = \"#{@appliance_config.hardware.network}\"" 182: 183: File.open(@deliverables.vmx, "w") { |f| f.write(vmx_data) } 184: 185: # create disk descriptor file 186: File.open(@deliverables.vmdk, "w") { |f| f.write(change_vmdk_values("vmfs")) } 187: 188: @log.debug "VMware enterprise image was built." 189: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 151 151: def build_vmware_personal 152: @log.debug "Building VMware personal image." 153: 154: if @plugin_config['thin_disk'] 155: @log.debug "Using qemu-img to convert the image..." 156: @image_helper.convert_disk(@previous_deliverables.disk, :vmdk, @deliverables.disk) 157: @log.debug "Conversion done." 158: else 159: copy_raw_image 160: 161: # create disk descriptor file 162: File.open(@deliverables.vmdk, "w") { |f| f.write(change_vmdk_values("monolithicFlat")) } 163: end 164: 165: # create .vmx file 166: File.open(@deliverables.vmx, "w") { |f| f.write(change_common_vmx_values) } 167: 168: @log.debug "VMware personal image was built." 169: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 151 151: def build_vmware_personal 152: @log.debug "Building VMware personal image." 153: 154: if @plugin_config['thin_disk'] 155: @log.debug "Using qemu-img to convert the image..." 156: @image_helper.convert_disk(@previous_deliverables.disk, :vmdk, @deliverables.disk) 157: @log.debug "Conversion done." 158: else 159: copy_raw_image 160: 161: # create disk descriptor file 162: File.open(@deliverables.vmdk, "w") { |f| f.write(change_vmdk_values("monolithicFlat")) } 163: end 164: 165: # create .vmx file 166: File.open(@deliverables.vmx, "w") { |f| f.write(change_common_vmx_values) } 167: 168: @log.debug "VMware personal image was built." 169: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 111 111: def change_common_vmx_values 112: vmx_data = File.open("#{File.dirname(__FILE__)}/src/base.vmx").read 113: 114: # replace version with current appliance version 115: vmx_data.gsub!(/#VERSION#/, "#{@appliance_config.version}.#{@appliance_config.release}") 116: # change name 117: vmx_data.gsub!(/#NAME#/, @appliance_config.name.to_s) 118: # and summary 119: vmx_data.gsub!(/#SUMMARY#/, @appliance_config.summary.to_s) 120: # replace guestOS informations to: linux or otherlinux-64, this seems to be the savests values 121: vmx_data.gsub!(/#GUESTOS#/, "#{@appliance_config.hardware.arch == "x86_64" ? "otherlinux-64" : "linux"}") 122: # memory size 123: vmx_data.gsub!(/#MEM_SIZE#/, @appliance_config.hardware.memory.to_s) 124: # memory size 125: vmx_data.gsub!(/#VCPU#/, @appliance_config.hardware.cpus.to_s) 126: # network name 127: # vmx_data.gsub!( /#NETWORK_NAME#/, @image_config.network_name ) 128: 129: vmx_data 130: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 111 111: def change_common_vmx_values 112: vmx_data = File.open("#{File.dirname(__FILE__)}/src/base.vmx").read 113: 114: # replace version with current appliance version 115: vmx_data.gsub!(/#VERSION#/, "#{@appliance_config.version}.#{@appliance_config.release}") 116: # change name 117: vmx_data.gsub!(/#NAME#/, @appliance_config.name.to_s) 118: # and summary 119: vmx_data.gsub!(/#SUMMARY#/, @appliance_config.summary.to_s) 120: # replace guestOS informations to: linux or otherlinux-64, this seems to be the savests values 121: vmx_data.gsub!(/#GUESTOS#/, "#{@appliance_config.hardware.arch == "x86_64" ? "otherlinux-64" : "linux"}") 122: # memory size 123: vmx_data.gsub!(/#MEM_SIZE#/, @appliance_config.hardware.memory.to_s) 124: # memory size 125: vmx_data.gsub!(/#VCPU#/, @appliance_config.hardware.cpus.to_s) 126: # network name 127: # vmx_data.gsub!( /#NETWORK_NAME#/, @image_config.network_name ) 128: 129: vmx_data 130: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 87 87: def change_vmdk_values(type) 88: vmdk_data = File.open("#{File.dirname(__FILE__)}/src/base.vmdk").read 89: 90: disk_size = 0.0 91: @appliance_config.hardware.partitions.values.each { |part| disk_size += part['size'].to_f } 92: 93: c, h, s, total_sectors = generate_scsi_chs(disk_size) 94: 95: is_enterprise = type.eql?("vmfs") 96: 97: vmdk_data.gsub!(/#NAME#/, @appliance_config.name) 98: vmdk_data.gsub!(/#TYPE#/, type) 99: vmdk_data.gsub!(/#EXTENT_TYPE#/, is_enterprise ? "VMFS" : "FLAT") 100: vmdk_data.gsub!(/#NUMBER#/, is_enterprise ? "" : "0") 101: vmdk_data.gsub!(/#HW_VERSION#/, "7") 102: vmdk_data.gsub!(/#CYLINDERS#/, c.to_s) 103: vmdk_data.gsub!(/#HEADS#/, h.to_s) 104: vmdk_data.gsub!(/#SECTORS#/, s.to_s) 105: vmdk_data.gsub!(/#TOTAL_SECTORS#/, total_sectors.to_s) 106: vmdk_data.gsub!(/#THIN_PROVISIONED#/, @plugin_config['thin_disk'] ? "1" : "0") 107: 108: vmdk_data 109: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 87 87: def change_vmdk_values(type) 88: vmdk_data = File.open("#{File.dirname(__FILE__)}/src/base.vmdk").read 89: 90: disk_size = 0.0 91: @appliance_config.hardware.partitions.values.each { |part| disk_size += part['size'].to_f } 92: 93: c, h, s, total_sectors = generate_scsi_chs(disk_size) 94: 95: is_enterprise = type.eql?("vmfs") 96: 97: vmdk_data.gsub!(/#NAME#/, @appliance_config.name) 98: vmdk_data.gsub!(/#TYPE#/, type) 99: vmdk_data.gsub!(/#EXTENT_TYPE#/, is_enterprise ? "VMFS" : "FLAT") 100: vmdk_data.gsub!(/#NUMBER#/, is_enterprise ? "" : "0") 101: vmdk_data.gsub!(/#HW_VERSION#/, "7") 102: vmdk_data.gsub!(/#CYLINDERS#/, c.to_s) 103: vmdk_data.gsub!(/#HEADS#/, h.to_s) 104: vmdk_data.gsub!(/#SECTORS#/, s.to_s) 105: vmdk_data.gsub!(/#TOTAL_SECTORS#/, total_sectors.to_s) 106: vmdk_data.gsub!(/#THIN_PROVISIONED#/, @plugin_config['thin_disk'] ? "1" : "0") 107: 108: vmdk_data 109: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 145 145: def copy_raw_image 146: @log.debug "Copying VMware image file, this may take several minutes..." 147: @exec_helper.execute "cp '#{@previous_deliverables.disk}' '#{@deliverables.disk}'" 148: @log.debug "VMware image copied." 149: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 145 145: def copy_raw_image 146: @log.debug "Copying VMware image file, this may take several minutes..." 147: @exec_helper.execute "cp '#{@previous_deliverables.disk}' '#{@deliverables.disk}'" 148: @log.debug "VMware image copied." 149: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 57 57: def create_readme 58: readme = File.open("#{File.dirname(__FILE__)}/src/README-#{@plugin_config['type']}").read 59: readme.gsub!(/#APPLIANCE_NAME#/, @appliance_config.name) 60: 61: readme 62: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 57 57: def create_readme 58: readme = File.open("#{File.dirname(__FILE__)}/src/README-#{@plugin_config['type']}").read 59: readme.gsub!(/#APPLIANCE_NAME#/, @appliance_config.name) 60: 61: readme 62: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 132 132: def customize_image 133: unless @appliance_config.post['vmware'].nil? or @appliance_config.post['vmware'].empty? 134: @image_helper.customize(@deliverables.disk) do |guestfs, guestfs_helper| 135: @appliance_config.post['vmware'].each do |cmd| 136: guestfs_helper.sh(cmd, :arch => @appliance_config.hardware.arch) 137: end 138: @log.debug "Post commands from appliance definition file executed." 139: end 140: else 141: @log.debug "No commands specified, skipping." 142: end 143: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 132 132: def customize_image 133: unless @appliance_config.post['vmware'].nil? or @appliance_config.post['vmware'].empty? 134: @image_helper.customize(@deliverables.disk) do |guestfs, guestfs_helper| 135: @appliance_config.post['vmware'].each do |cmd| 136: guestfs_helper.sh(cmd, :arch => @appliance_config.hardware.arch) 137: end 138: @log.debug "Post commands from appliance definition file executed." 139: end 140: else 141: @log.debug "No commands specified, skipping." 142: end 143: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 38 38: def execute 39: @log.info "Converting image to VMware #{@plugin_config['type']} format..." 40: 41: case @plugin_config['type'] 42: when 'personal' 43: build_vmware_personal 44: when 'enterprise' 45: build_vmware_enterprise 46: else 47: raise "Not known VMware format specified. Available are: personal and enterprise. See http://boxgrinder.org/tutorials/boxgrinder-build-plugins/#VMware_Platform_Plugin for more info." 48: end 49: 50: customize_image 51: 52: File.open(@deliverables.readme, "w") { |f| f.write(create_readme) } 53: 54: @log.info "Image converted to VMware format." 55: end
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 38 38: def execute 39: @log.info "Converting image to VMware #{@plugin_config['type']} format..." 40: 41: case @plugin_config['type'] 42: when 'personal' 43: build_vmware_personal 44: when 'enterprise' 45: build_vmware_enterprise 46: else 47: raise "Not known VMware format specified. Available are: personal and enterprise. See http://boxgrinder.org/tutorials/boxgrinder-build-plugins/#VMware_Platform_Plugin for more info." 48: end 49: 50: customize_image 51: 52: File.open(@deliverables.readme, "w") { |f| f.write(create_readme) } 53: 54: @log.info "Image converted to VMware format." 55: end
returns value of cylinders, heads and sector for selected disk size (in GB) kb.vmware.com/kb/1026254
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 66 66: def generate_scsi_chs(disk_size) 67: if disk_size < 1 68: h = 64 69: s = 32 70: else 71: if disk_size < 2 72: h = 128 73: s = 32 74: else 75: h = 255 76: s = 63 77: end 78: end 79: 80: # GB MB KB B 81: c = disk_size * 1024 * 1024 * 1024 / (h*s*512) 82: total_sectors = disk_size * 1024 * 1024 * 1024 / 512 83: 84: [c.to_i, h.to_i, s.to_i, total_sectors.to_i] 85: end
returns value of cylinders, heads and sector for selected disk size (in GB) kb.vmware.com/kb/1026254
# File lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb, line 66 66: def generate_scsi_chs(disk_size) 67: if disk_size < 1 68: h = 64 69: s = 32 70: else 71: if disk_size < 2 72: h = 128 73: s = 32 74: else 75: h = 255 76: s = 63 77: end 78: end 79: 80: # GB MB KB B 81: c = disk_size * 1024 * 1024 * 1024 / (h*s*512) 82: total_sectors = disk_size * 1024 * 1024 * 1024 / 512 83: 84: [c.to_i, h.to_i, s.to_i, total_sectors.to_i] 85: end