| 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