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