| 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