PackerFiles 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/PackerFiles.gemspec +36 -0
  6. data/README.md +32 -0
  7. data/Rakefile +21 -0
  8. data/bin/pkf +5 -0
  9. data/lib/PackerFiles/CLI/OS.rb +44 -0
  10. data/lib/PackerFiles/CLI/Root.rb +41 -0
  11. data/lib/PackerFiles/Core/Base.rb +23 -0
  12. data/lib/PackerFiles/Core/CDImage.rb +185 -0
  13. data/lib/PackerFiles/Core/Disk.rb +135 -0
  14. data/lib/PackerFiles/Core/Exceptions.rb +65 -0
  15. data/lib/PackerFiles/Core/Hypervisor.rb +96 -0
  16. data/lib/PackerFiles/Core/Keyboard.rb +38 -0
  17. data/lib/PackerFiles/Core/Locale.rb +62 -0
  18. data/lib/PackerFiles/Core/LogicalVolume.rb +41 -0
  19. data/lib/PackerFiles/Core/Network.rb +67 -0
  20. data/lib/PackerFiles/Core/Packages.rb +30 -0
  21. data/lib/PackerFiles/Core/Partition.rb +41 -0
  22. data/lib/PackerFiles/Core/TimeZone.rb +45 -0
  23. data/lib/PackerFiles/Core/User.rb +46 -0
  24. data/lib/PackerFiles/Core/VolumeGroup.rb +50 -0
  25. data/lib/PackerFiles/Core/example/CDImage.txt +75 -0
  26. data/lib/PackerFiles/Core/example/Disk.txt +29 -0
  27. data/lib/PackerFiles/Core/example/Hypervisor.txt +111 -0
  28. data/lib/PackerFiles/Core/example/Keyboard.txt +28 -0
  29. data/lib/PackerFiles/Core/example/Locale.txt +31 -0
  30. data/lib/PackerFiles/Core/example/Network.txt +68 -0
  31. data/lib/PackerFiles/Core/example/Packages.txt +22 -0
  32. data/lib/PackerFiles/Core/example/TimeZone.txt +36 -0
  33. data/lib/PackerFiles/Core/example/User.txt +48 -0
  34. data/lib/PackerFiles/OS/Builder.rb +116 -0
  35. data/lib/PackerFiles/OS/CentOS/CD.rb +81 -0
  36. data/lib/PackerFiles/OS/CentOS/Kickstart.rb +64 -0
  37. data/lib/PackerFiles/OS/CentOS/Server.rb +170 -0
  38. data/lib/PackerFiles/OS/CentOS/Templates/Base_erb.rb +4 -0
  39. data/lib/PackerFiles/OS/CentOS/Templates/Disk_erb.rb +35 -0
  40. data/lib/PackerFiles/OS/CentOS/Templates/Keyboard_erb.rb +4 -0
  41. data/lib/PackerFiles/OS/CentOS/Templates/Locale_erb.rb +4 -0
  42. data/lib/PackerFiles/OS/CentOS/Templates/Network_erb.rb +17 -0
  43. data/lib/PackerFiles/OS/CentOS/Templates/Packages_erb.rb +34 -0
  44. data/lib/PackerFiles/OS/CentOS/Templates/Tail_erb.rb +15 -0
  45. data/lib/PackerFiles/OS/CentOS/Templates/TimeZone_erb.rb +10 -0
  46. data/lib/PackerFiles/OS/CentOS/Templates/User_erb.rb +20 -0
  47. data/lib/PackerFiles/OS/CentOS/Templates/boot_command_erb.rb +16 -0
  48. data/lib/PackerFiles/OS/CentOS/Templates/command_as_root_erb.rb +1 -0
  49. data/lib/PackerFiles/OS/CentOS/Templates/disable_root_erb.rb +1 -0
  50. data/lib/PackerFiles/OS/CentOS/Templates/enable_root_erb.rb +1 -0
  51. data/lib/PackerFiles/OS/CentOS/Templates/shutdown_command_erb.rb +1 -0
  52. data/lib/PackerFiles/OS/Debian/Apt.rb +42 -0
  53. data/lib/PackerFiles/OS/Debian/CD.rb +65 -0
  54. data/lib/PackerFiles/OS/Debian/Mirrors.rb +73 -0
  55. data/lib/PackerFiles/OS/Debian/Preseed.rb +64 -0
  56. data/lib/PackerFiles/OS/Debian/Server.rb +169 -0
  57. data/lib/PackerFiles/OS/Debian/Templates/Apt_erb.rb +18 -0
  58. data/lib/PackerFiles/OS/Debian/Templates/Disk_erb.rb +69 -0
  59. data/lib/PackerFiles/OS/Debian/Templates/Keyboard_erb.rb +5 -0
  60. data/lib/PackerFiles/OS/Debian/Templates/Locale_erb.rb +7 -0
  61. data/lib/PackerFiles/OS/Debian/Templates/Mirrors_erb.rb +9 -0
  62. data/lib/PackerFiles/OS/Debian/Templates/Network_erb.rb +19 -0
  63. data/lib/PackerFiles/OS/Debian/Templates/Packages_erb.rb +6 -0
  64. data/lib/PackerFiles/OS/Debian/Templates/TimeZone_erb.rb +6 -0
  65. data/lib/PackerFiles/OS/Debian/Templates/User_erb.rb +14 -0
  66. data/lib/PackerFiles/OS/Debian/Templates/boot_command_erb.rb +24 -0
  67. data/lib/PackerFiles/OS/Debian/Templates/command_as_root_erb.rb +1 -0
  68. data/lib/PackerFiles/OS/Debian/Templates/disable_root_erb.rb +5 -0
  69. data/lib/PackerFiles/OS/Debian/Templates/enable_root_erb.rb +1 -0
  70. data/lib/PackerFiles/OS/Debian/Templates/shutdown_command_erb.rb +1 -0
  71. data/lib/PackerFiles/OS/Debian/example/Apt.txt +55 -0
  72. data/lib/PackerFiles/OS/DocGenerator.rb +51 -0
  73. data/lib/PackerFiles/OS/Finder.rb +96 -0
  74. data/lib/PackerFiles/OS/RHEL/CD.rb +32 -0
  75. data/lib/PackerFiles/OS/RHEL/Fedora.rb +59 -0
  76. data/lib/PackerFiles/OS/RHEL/FedoraCD.rb +68 -0
  77. data/lib/PackerFiles/OS/RHEL/Server.rb +32 -0
  78. data/lib/PackerFiles/OS/RHEL/Templates/Fedora_Tail_erb.rb +14 -0
  79. data/lib/PackerFiles/OS/RHEL/Templates/boot_command_fedora_erb.rb +16 -0
  80. data/lib/PackerFiles/OS/SUSE/Templates/Base_erb.xml +32 -0
  81. data/lib/PackerFiles/OS/SUSE/Templates/Disk_erb.xml +110 -0
  82. data/lib/PackerFiles/OS/SUSE/Templates/Keyboard_erb.xml +7 -0
  83. data/lib/PackerFiles/OS/SUSE/Templates/Locale_erb.xml +18 -0
  84. data/lib/PackerFiles/OS/SUSE/Templates/Network_erb.xml +143 -0
  85. data/lib/PackerFiles/OS/SUSE/Templates/Packages_erb.xml +29 -0
  86. data/lib/PackerFiles/OS/SUSE/Templates/Tail_erb.xml +4 -0
  87. data/lib/PackerFiles/OS/SUSE/Templates/TimeZone_erb.xml +15 -0
  88. data/lib/PackerFiles/OS/SUSE/Templates/User_erb.xml +57 -0
  89. data/lib/PackerFiles/OS/SUSE/Templates/boot_command_erb.rb +23 -0
  90. data/lib/PackerFiles/OS/SUSE/Templates/command_as_root_erb.rb +1 -0
  91. data/lib/PackerFiles/OS/SUSE/Templates/disable_root_erb.rb +1 -0
  92. data/lib/PackerFiles/OS/SUSE/Templates/enable_root_erb.rb +1 -0
  93. data/lib/PackerFiles/OS/SUSE/Templates/shutdown_command_erb.rb +1 -0
  94. data/lib/PackerFiles/OS/Ubuntu/CD.rb +81 -0
  95. data/lib/PackerFiles/OS/Ubuntu/Desktop.rb +50 -0
  96. data/lib/PackerFiles/OS/Ubuntu/DesktopCD.rb +16 -0
  97. data/lib/PackerFiles/OS/Ubuntu/Mirrors.rb +103 -0
  98. data/lib/PackerFiles/OS/Ubuntu/Server.rb +78 -0
  99. data/lib/PackerFiles/OS/Ubuntu/Templates/Apt_erb.rb +18 -0
  100. data/lib/PackerFiles/OS/Ubuntu/Templates/boot_command_desktop_erb.rb +36 -0
  101. data/lib/PackerFiles/OS/Ubuntu/Templates/boot_command_erb.rb +30 -0
  102. data/lib/PackerFiles/OS/Ubuntu/Templates/ubiquity_erb.rb +8 -0
  103. data/lib/PackerFiles/OS/example/Doc.txt +8 -0
  104. data/lib/PackerFiles/Provision/Base.rb +20 -0
  105. data/lib/PackerFiles/Provision/ChefSolo.rb +90 -0
  106. data/lib/PackerFiles/Provision/ChefSoloHelper.rb +72 -0
  107. data/lib/PackerFiles/Provision/Copy.rb +22 -0
  108. data/lib/PackerFiles/Provision/ExternalScript.rb +43 -0
  109. data/lib/PackerFiles/Provision/InlineScript.rb +37 -0
  110. data/lib/PackerFiles/Provision/Provisioners.rb +87 -0
  111. data/lib/PackerFiles/Provision/example/Provisioners.txt +21 -0
  112. data/lib/PackerFiles/Utils/AutoZone.rb +96 -0
  113. data/lib/PackerFiles/Utils/FastestURL.rb +73 -0
  114. data/lib/PackerFiles/Utils/Generator.rb +34 -0
  115. data/lib/PackerFiles/Utils/HashSerializer.rb +110 -0
  116. data/lib/PackerFiles/Utils/Size.rb +44 -0
  117. data/lib/PackerFiles/Utils/TypeAccessor.rb +71 -0
  118. data/lib/PackerFiles/Virtual/Hypervisors.rb +72 -0
  119. data/lib/PackerFiles/Virtual/KVM.rb +119 -0
  120. data/lib/PackerFiles/Virtual/KVMConverter.rb +79 -0
  121. data/lib/PackerFiles/Virtual/VMWare.rb +108 -0
  122. data/lib/PackerFiles/Virtual/VMWareConverter.rb +78 -0
  123. data/lib/PackerFiles/Virtual/VirtualBox.rb +98 -0
  124. data/lib/PackerFiles/Virtual/VirtualBoxConverter.rb +75 -0
  125. data/lib/PackerFiles/Virtual/example/Hypervisors.txt +23 -0
  126. data/lib/PackerFiles/version.rb +3 -0
  127. data/lib/PackerFiles.rb +44 -0
  128. data/spec/core/builder_spec.rb +84 -0
  129. data/spec/core/cdimage_spec.rb +159 -0
  130. data/spec/core/disk_spec.rb +191 -0
  131. data/spec/core/keyboard_spec.rb +36 -0
  132. data/spec/core/locale_spec.rb +73 -0
  133. data/spec/core/network_spec.rb +96 -0
  134. data/spec/core/packages_spec.rb +18 -0
  135. data/spec/core/timezone_spec.rb +43 -0
  136. data/spec/core/user_spec.rb +44 -0
  137. data/spec/core/volume_group_spec.rb +53 -0
  138. data/spec/os/centos/cd_spec.rb +12 -0
  139. data/spec/os/centos/data/Server-Script-Provisioner.rb +57 -0
  140. data/spec/os/centos/data/Server.rb +55 -0
  141. data/spec/os/centos/data/chef-solo-provisioner.rb +58 -0
  142. data/spec/os/centos/finder_spec.rb +22 -0
  143. data/spec/os/centos/templates/boot_command_spec.rb +57 -0
  144. data/spec/os/centos/templates/disk_spec.rb +79 -0
  145. data/spec/os/centos/templates/keyboard_spec.rb +18 -0
  146. data/spec/os/centos/templates/locale_spec.rb +26 -0
  147. data/spec/os/centos/templates/network_spec.rb +38 -0
  148. data/spec/os/centos/templates/packages_spec.rb +18 -0
  149. data/spec/os/centos/templates/timezone_spec.rb +37 -0
  150. data/spec/os/centos/templates/user_spec.rb +24 -0
  151. data/spec/os/debian/apt_spec.rb +50 -0
  152. data/spec/os/debian/cd_spec.rb +30 -0
  153. data/spec/os/debian/data/7zip.tar.gz +0 -0
  154. data/spec/os/debian/data/All-sections.rb +60 -0
  155. data/spec/os/debian/data/Chef-Solo-Provisioner.rb +60 -0
  156. data/spec/os/debian/data/Copy-Provisioner.rb +61 -0
  157. data/spec/os/debian/data/External-Script-Provisioner.rb +69 -0
  158. data/spec/os/debian/data/Missing-CDImage.rb +53 -0
  159. data/spec/os/debian/data/Missing-VMWare-KVM-sections.rb +51 -0
  160. data/spec/os/debian/data/Missing-sections.rb +53 -0
  161. data/spec/os/debian/data/Script-Provisioner.rb +62 -0
  162. data/spec/os/debian/data/chef-solo-cookbooks/git_setup/Berksfile.lock +32 -0
  163. data/spec/os/debian/data/chef-solo-cookbooks/git_setup/README.md +81 -0
  164. data/spec/os/debian/data/chef-solo-cookbooks/git_setup/attributes/default.rb +3 -0
  165. data/spec/os/debian/data/chef-solo-cookbooks/git_setup/metadata.rb +11 -0
  166. data/spec/os/debian/data/chef-solo-cookbooks/git_setup/recipes/default.rb +30 -0
  167. data/spec/os/debian/data/chef-solo.json +5 -0
  168. data/spec/os/debian/data/test-script.sh +4 -0
  169. data/spec/os/debian/finder_spec.rb +59 -0
  170. data/spec/os/debian/mirrors_spec.rb +18 -0
  171. data/spec/os/debian/preseed_spec.rb +56 -0
  172. data/spec/os/debian/server_spec.rb +59 -0
  173. data/spec/os/debian/templates/apt_spec.rb +20 -0
  174. data/spec/os/debian/templates/boot_command_spec.rb +56 -0
  175. data/spec/os/debian/templates/disk_spec.rb +81 -0
  176. data/spec/os/debian/templates/keyboard_spec.rb +18 -0
  177. data/spec/os/debian/templates/locale_spec.rb +36 -0
  178. data/spec/os/debian/templates/mirrors_spec.rb +16 -0
  179. data/spec/os/debian/templates/network_spec.rb +38 -0
  180. data/spec/os/debian/templates/packages_spec.rb +17 -0
  181. data/spec/os/debian/templates/timezone_spec.rb +36 -0
  182. data/spec/os/debian/templates/user_spec.rb +25 -0
  183. data/spec/os/finder_spec.rb +21 -0
  184. data/spec/os/rhel/data/Fedora.rb +45 -0
  185. data/spec/os/rhel/data/Server-Custom.rb +54 -0
  186. data/spec/os/rhel/data/Server.rb +45 -0
  187. data/spec/os/rhel/finder_spec.rb +21 -0
  188. data/spec/os/ubuntu/cd_spec.rb +28 -0
  189. data/spec/os/ubuntu/data/Desktop.rb +61 -0
  190. data/spec/os/ubuntu/data/Server.rb +61 -0
  191. data/spec/os/ubuntu/finder_spec.rb +17 -0
  192. data/spec/os/ubuntu/mirrors_spec.rb +18 -0
  193. data/spec/utils/autozone_spec.rb +33 -0
  194. data/spec/virtual/virtual_box_spec.rb +16 -0
  195. metadata +405 -0
@@ -0,0 +1,119 @@
1
+ # Requires
2
+ require 'Core/Hypervisor'
3
+ require 'Utils/HashSerializer'
4
+ require 'Utils/Size'
5
+
6
+ module PackerFiles
7
+
8
+ module Virtual
9
+
10
+ # Abstraction for KVM(QEMU) builder in Packer. Refer to Packer.io
11
+ # documentation on more details on the various variables for
12
+ # QEMU ISO Builder.
13
+ class KVM < Utils::HashSerializer
14
+
15
+ # Import Size with KVM class as a Mix-in
16
+ include Utils::Size
17
+
18
+ # List of attributes that would be converted into Hash Values. The Hash
19
+ # values will eventually be converted into JSON values.
20
+ hash_variable :iso_checksum
21
+ hash_variable :iso_checksum_type
22
+ hash_variable :iso_url
23
+ hash_variable :ssh_username
24
+ hash_variable :accelerator
25
+ hash_variable :boot_command, Array
26
+ hash_variable :boot_wait
27
+ hash_variable :disk_size, Integer
28
+ hash_variable :disk_interface
29
+ hash_variable :floppy_files, Array
30
+ hash_variable :format
31
+ hash_variable :headless
32
+ hash_variable :http_directory
33
+ hash_variable :http_port_min, Integer
34
+ hash_variable :http_port_max, Integer
35
+ hash_variable :iso_urls, Array
36
+ hash_variable :net_device
37
+ hash_variable :output_directory
38
+ hash_variable :qemuargs, Array
39
+ hash_variable :qemu_binary
40
+ hash_variable :shutdown_command
41
+ hash_variable :shutdown_timeout
42
+ hash_variable :ssh_host_port_min, Integer
43
+ hash_variable :ssh_host_port_max, Integer
44
+ hash_variable :ssh_key_path
45
+ hash_variable :ssh_password
46
+ hash_variable :ssh_port, Integer
47
+ hash_variable :ssh_wait_timeout
48
+ hash_variable :vm_name
49
+ hash_variable :type
50
+ hash_variable :vnc_port_min
51
+ hash_variable :vnc_port_max
52
+ hash_variable :name
53
+
54
+ # Constructor. Supports the standard block semantics via yield
55
+ def initialize(&block)
56
+ self.type = 'qemu'
57
+ yield self if block_given?
58
+ end
59
+
60
+ # Given an Hypervisor object, convert into a list of qemuargs commands
61
+ def Hypervisor(hyper, amd64=true)
62
+
63
+ # Allocate a new array to store values.
64
+ value = Array.new
65
+
66
+ # If CPU hot plug is enabled, then current cpu count < max cpu count
67
+ count = hyper.cpu_count.to_s
68
+ if (hyper.cpu_hot_plug)
69
+ value << ["-smp", "cpus=#{count},maxcpus=255"]
70
+ else
71
+ value << ["-smp", "cpus=#{count},maxcpus=#{count}"]
72
+ end
73
+
74
+ # NOTE: CPU Execution Cap is not implemented in KVM
75
+ # NOTE: Video RAM Size is not implemented in KVM
76
+
77
+ # RAM Size is always translated into MiB
78
+ value << ["-m", MiB(hyper.ram_size).to_s]
79
+
80
+ # Memory Balloon size is ignored by KVM. It is just enabling or
81
+ # disabling a feature.
82
+ if MiB(hyper.guest_balloon_size) > 0
83
+ value << ["-balloon", "none"]
84
+ else
85
+ value << ["-balloon", "virtio"]
86
+ end
87
+
88
+ # ACPI is by default enabled on KVM. We just have to handle the
89
+ # disabled case.
90
+ if !hyper.acpi_enabled
91
+ value << ["-no-acpi"]
92
+ end
93
+
94
+ # We have to use EFI firmware for virtual machines, if it has been
95
+ # asked for.
96
+ if hyper.use_efi
97
+ value << ["-bios", "/usr/share/ovmf/OVMF.fd"]
98
+ end
99
+
100
+ # KVM works very differently w.r.t. CPU features. First a base CPU
101
+ # (64 bit or 32 bit) has to be selected and then more features need
102
+ # to be added.
103
+ cpu_features = (amd64)?'qemu64':'qemu32'
104
+ cpu_features += ',+pae' if hyper.pae_enabled
105
+ cpu_features += ',+vmx' if hyper.hw_virt_enabled
106
+ cpu_features += ',+npt' if hyper.hw_nested_pages
107
+ cpu_features += ',+pse36' if hyper.use_large_pages
108
+ cpu_features += ',+hypervisor' if hyper.unrestricted_guest_mode
109
+ value << ["-cpu", cpu_features]
110
+
111
+ # Set the value for QEMU Args
112
+ self.qemuargs = value
113
+ end
114
+
115
+ end
116
+
117
+ end # Virtual
118
+
119
+ end # PackerFiles
@@ -0,0 +1,79 @@
1
+ # Requires
2
+ require 'Virtual/KVM'
3
+ require 'Utils/Generator'
4
+
5
+ # Converts a given OS into a KVM builder
6
+ module PackerFiles
7
+ module Virtual
8
+ class KVMConverter
9
+
10
+ # Hash Value
11
+ attr_reader :value
12
+
13
+ # Constructor
14
+ def initialize(os, gen)
15
+ @value = convert(os, gen).to_hash
16
+ end
17
+
18
+ # Convert OS object into a hash
19
+ def convert(os, gen)
20
+ KVM.new do |kvm|
21
+
22
+ # Fill in output directory
23
+ rel = os.CDImage.release
24
+ arch = os.CDImage.arch
25
+ name = os.name.gsub('::', '-')
26
+ kvm.output_directory = "output-#{name}-#{rel}-#{arch}-#{kvm.type}"
27
+ kvm.name = "#{name}-#{rel}-#{arch}-#{kvm.type}"
28
+
29
+ # Fill in image details, Some amount of url handling
30
+ # is really required to handle various corner cases.
31
+ # thus making the code a bit harder to understand
32
+ kvm.iso_checksum_type = os.CDImage.check_sum_type
33
+ kvm.iso_checksum = os.CDImage.check_sum
34
+
35
+ # The code below creates a user variable called mirror
36
+ # whose base value is the URL fragment w/o the file-name.
37
+ url = URI::parse(os.CDImage.iso_url)
38
+ file = File.basename(url.path)
39
+ url.path = File.dirname(url.path)
40
+ gen.variables['mirror'] = url.to_s
41
+ kvm.iso_url = "{{user `mirror`}}/#{file}"
42
+
43
+ # Fill in SSH specifics
44
+ kvm.ssh_username = os.User.login
45
+ kvm.ssh_password = os.User.password
46
+ kvm.ssh_wait_timeout = '10000s'
47
+
48
+ # Fill in other specifics
49
+ kvm.disk_size = os.Disk.size
50
+ kvm.http_directory = File.basename(os.http_dir)
51
+
52
+ # Fill in boot command and boot_wait command
53
+ gen.variables['host'] = ''
54
+ gen.variables['port'] = ''
55
+ user_var_name = name + "-#{kvm.type}-boot-wait"
56
+ gen.variables[user_var_name] = "10s"
57
+ kvm.boot_command = os.boot_command
58
+ kvm.boot_wait = "{{user `#{user_var_name}`}}"
59
+
60
+ # Fill in shutdown command
61
+ kvm.shutdown_command = os.shutdown_command
62
+
63
+ # If the guest OS type contains 64 bit OS, then we need to enable
64
+ # a 64 bit CPU.
65
+ if os.guest_os_type.match("64")
66
+ kvm.Hypervisor(os.Hypervisors.KVM, true)
67
+ else
68
+ kvm.Hypervisor(os.Hypervisors.KVM, false)
69
+ end
70
+
71
+ # Merge with Custom attributes
72
+ kvm.merge_hs(os.Hypervisors.KVM.custom)
73
+ end
74
+
75
+ end
76
+
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,108 @@
1
+ # Requires
2
+ require 'Core/Hypervisor'
3
+ require 'Utils/HashSerializer'
4
+ require 'Utils/Size'
5
+
6
+ module PackerFiles
7
+
8
+ module Virtual
9
+
10
+ # Abstraction for VMWare builder in Packer. Refer to Packer.io
11
+ # documentation on more details on the various variables for
12
+ # VMWare ISO Builder.
13
+ class VMWare < Utils::HashSerializer
14
+
15
+ # Import Size with VirtualBox class as a Mix-in
16
+ include Utils::Size
17
+
18
+ # List of attributes that would be converted into Hash Values. The Hash
19
+ # values will eventually be converted into JSON values.
20
+ hash_variable :iso_checksum
21
+ hash_variable :iso_checksum_type
22
+ hash_variable :iso_url
23
+ hash_variable :ssh_username
24
+ hash_variable :boot_command, Array
25
+ hash_variable :boot_wait
26
+ hash_variable :disk_size, Integer
27
+ hash_variable :disk_type_id
28
+ hash_variable :floppy_files, Array
29
+ hash_variable :fusion_app_path
30
+ hash_variable :guest_os_type
31
+ hash_variable :headless
32
+ hash_variable :http_directory
33
+ hash_variable :http_port_min, Integer
34
+ hash_variable :http_port_max, Integer
35
+ hash_variable :iso_urls, Array
36
+ hash_variable :output_directory
37
+ hash_variable :remote_cache_datastore
38
+ hash_variable :remote_cache_directory
39
+ hash_variable :remote_datastore
40
+ hash_variable :remote_host
41
+ hash_variable :remote_password
42
+ hash_variable :remote_type
43
+ hash_variable :remote_username
44
+ hash_variable :shutdown_command
45
+ hash_variable :shutdown_timeout
46
+ hash_variable :ssh_host
47
+ hash_variable :ssh_key_path
48
+ hash_variable :ssh_password
49
+ hash_variable :ssh_port, Integer
50
+ hash_variable :ssh_wait_timeout
51
+ hash_variable :tools_upload_flavor
52
+ hash_variable :tools_upload_path
53
+ hash_variable :vm_name
54
+ hash_variable :vmdk_name
55
+ hash_variable :vmx_data, Hash
56
+ hash_variable :vmx_data_post, Hash
57
+ hash_variable :vmx_template_path
58
+ hash_variable :vnc_port_min, Integer
59
+ hash_variable :vnc_port_max, Integer
60
+ hash_variable :type
61
+ hash_variable :name
62
+
63
+ # Constructor. Supports the standard block semantics via yield
64
+ def initialize(&block)
65
+ self.type = 'vmware-iso'
66
+ yield self if block_given?
67
+ end
68
+
69
+ # Given an Hypervisor object, convert into a list of VMX commands
70
+ # and set vmx_data accordingly
71
+ def Hypervisor(hyper)
72
+ value = Hash.new
73
+ value['numvcpus'] = hyper.cpu_count.to_s
74
+ value['vcpu.hotadd'] = true_false(hyper.cpu_hot_plug)
75
+ value['memsize'] = MiB(hyper.ram_size).to_s
76
+ value['mem.hotadd'] = 'TRUE'
77
+ value['svga.vramsize'] = Bytes(MiB(hyper.video_ram_size)).to_s
78
+ value['acpi.present'] = true_false(hyper.acpi_enabled)
79
+ value['paevm'] = true_false(hyper.pae_enabled)
80
+ value['vhv.enable'] = true_false(hyper.hw_virt_enabled)
81
+ value['monitor_control.disable_mmu_largepages'] = true_false(!hyper.use_large_pages)
82
+ value['mks.enable3d'] = true_false(hyper.video_3d_acceleration)
83
+ value['firmware'] = 'efi' if (hyper.use_efi)
84
+ value['sched.mem.maxmemctl'] = MiB(hyper.guest_balloon_size)
85
+
86
+ # CPU Speed limit is done by converting any value into MHZ
87
+ value['sched.cpu.max'] = MiB(hyper.cpu_speed)
88
+ value['sched.cpu.units'] = 'mhz'
89
+
90
+ #NOTE: CPU Execution Cap is not supported in VMX File settings.
91
+ #NOTE: Extended Page Table [Nested Paging] is enabled because of VHV.
92
+ #NOTE: Unrestricted Guest Mode is enabled because of VHV.
93
+ self.vmx_data = value
94
+ end
95
+
96
+ # Convert a boolean to a TRUE/FALSE string
97
+ private
98
+ def true_false(value)
99
+ return "TRUE" if (value)
100
+ return "FALSE" if (!value)
101
+ end
102
+
103
+
104
+ end
105
+
106
+ end # Virtual
107
+
108
+ end # PackerFiles
@@ -0,0 +1,78 @@
1
+ # Requires
2
+ require 'Virtual/VMWare'
3
+ require 'Utils/Generator'
4
+
5
+ # Converts a given OS into a VMWare builder
6
+ module PackerFiles
7
+ module Virtual
8
+ class VMWareConverter
9
+
10
+ # Hash Value
11
+ attr_reader :value
12
+
13
+ # Constructor
14
+ def initialize(os, gen)
15
+ @value = convert(os, gen).to_hash
16
+ end
17
+
18
+ # Convert OS object into a hash
19
+ def convert(os, gen)
20
+ VMWare.new do |vmware|
21
+
22
+ # Fill in output directory and builder name
23
+ rel = os.CDImage.release
24
+ arch = os.CDImage.arch
25
+ name = os.name.gsub('::', '-')
26
+ vmware.output_directory = "output-#{name}-#{rel}-#{arch}-#{vmware.type}"
27
+ vmware.name = "#{name}-#{rel}-#{arch}-#{vmware.type}"
28
+
29
+ # Fill in image details, Some amount of url handling
30
+ # is really required to handle various corner cases.
31
+ # thus making the code a bit harder to understand
32
+ vmware.iso_checksum_type = os.CDImage.check_sum_type
33
+ vmware.iso_checksum = os.CDImage.check_sum
34
+
35
+ # The code below creates a user variable called mirror
36
+ # whose base value is the URL fragment w/o the file-name.
37
+ url = URI::parse(os.CDImage.iso_url)
38
+ file = File.basename(url.path)
39
+ url.path = File.dirname(url.path)
40
+ gen.variables['mirror'] = url.to_s
41
+ vmware.iso_url = "{{user `mirror`}}/#{file}"
42
+
43
+ # Fill in SSH specifics
44
+ vmware.ssh_username = os.User.login
45
+ vmware.ssh_password = os.User.password
46
+ vmware.ssh_wait_timeout = '10000s'
47
+
48
+ # Fill in other specifics
49
+ vmware.disk_size = os.Disk.size
50
+ vmware.http_directory = File.basename(os.http_dir)
51
+ vmware.guest_os_type = os.vmware_guest_os_type
52
+
53
+ # Fill in boot command and boot_wait timeout
54
+ gen.variables['host'] = ''
55
+ gen.variables['port'] = ''
56
+ user_var_name = name + "-#{vmware.type}-boot-wait"
57
+ gen.variables[user_var_name] = "10s"
58
+ vmware.boot_command = os.boot_command
59
+ vmware.boot_wait = "{{user `#{user_var_name}`}}"
60
+
61
+ # Fill in shutdown command
62
+ vmware.shutdown_command = os.shutdown_command
63
+
64
+ # Generate vmx commands
65
+ vmware.Hypervisor(os.Hypervisors.VMWare)
66
+
67
+ # Tools flavor
68
+ vmware.tools_upload_flavor = os.vmware_guest_os_flavor
69
+
70
+ # Merge with Custom values
71
+ vmware.merge_hs(os.Hypervisors.VMWare.custom)
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,98 @@
1
+ # Requires
2
+ require 'Core/Hypervisor'
3
+ require 'Utils/HashSerializer'
4
+ require 'Utils/Size'
5
+
6
+ module PackerFiles
7
+
8
+ module Virtual
9
+
10
+ # Abstraction for VirtualBox builder in Packer. Refer to Packer.io
11
+ # documentation on more details on the various variables for
12
+ # VirtualBox ISO Builder.
13
+ class VirtualBox < Utils::HashSerializer
14
+
15
+ # Import Size with VirtualBox class as a Mix-in
16
+ include Utils::Size
17
+
18
+ # List of attributes that would be converted into Hash Values. The Hash
19
+ # values will eventually be converted into JSON values.
20
+ hash_variable :iso_checksum
21
+ hash_variable :iso_checksum_type
22
+ hash_variable :iso_url
23
+ hash_variable :ssh_username
24
+ hash_variable :boot_command, Array
25
+ hash_variable :boot_wait
26
+ hash_variable :disk_size, Integer
27
+ hash_variable :export_opts, Array
28
+ hash_variable :floppy_files, Array
29
+ hash_variable :format
30
+ hash_variable :guest_additions_mode
31
+ hash_variable :guest_additions_path
32
+ hash_variable :guest_additions_sha256
33
+ hash_variable :guest_additions_url
34
+ hash_variable :guest_os_type
35
+ hash_variable :hard_drive_interface
36
+ hash_variable :headless
37
+ hash_variable :http_directory
38
+ hash_variable :http_port_min, Integer
39
+ hash_variable :http_port_max, Integer
40
+ hash_variable :iso_interface
41
+ hash_variable :iso_urls, Array
42
+ hash_variable :output_directory
43
+ hash_variable :shutdown_command
44
+ hash_variable :shutdown_timeout
45
+ hash_variable :ssh_host_port_min, Integer
46
+ hash_variable :ssh_host_port_max, Integer
47
+ hash_variable :ssh_key_path
48
+ hash_variable :ssh_password
49
+ hash_variable :ssh_port, Integer
50
+ hash_variable :ssh_wait_timeout
51
+ hash_variable :vboxmanage, Array
52
+ hash_variable :vboxmanage_post, Array
53
+ hash_variable :virtualbox_version_file
54
+ hash_variable :vm_name
55
+ hash_variable :type
56
+ hash_variable :name
57
+
58
+ # Constructor. Supports the standard block semantics via yield
59
+ def initialize(&block)
60
+ self.type = 'virtualbox-iso'
61
+ yield self if block_given?
62
+ end
63
+
64
+ # Given an Hypervisor object, convert into a list of VBoxmanage commands
65
+ # and set vboxmanage attribute accordingly.
66
+ def Hypervisor(hyper)
67
+ value = Array.new
68
+ std = ["modifyvm", "{{.Name}}"]
69
+ value << std + ["--cpus", hyper.cpu_count.to_s]
70
+ value << std + ["--cpuhotplug", on_off(hyper.cpu_hot_plug)]
71
+ value << std + ["--cpuexecutioncap", hyper.cpu_execution_cap.to_s]
72
+ value << std + ["--memory", MiB(hyper.ram_size).to_s]
73
+ value << std + ["--vram", MiB(hyper.video_ram_size).to_s]
74
+ value << std + ["--acpi", on_off(hyper.acpi_enabled)]
75
+ value << std + ["--pae", on_off(hyper.pae_enabled)]
76
+ value << std + ["--hwvirtex", on_off(hyper.hw_virt_enabled)]
77
+ value << std + ["--nestedpaging", on_off(hyper.hw_virt_enabled)]
78
+ value << std + ["--vtxvpid", on_off(hyper.hw_virt_enabled)]
79
+ value << std + ["--largepages", on_off(hyper.use_large_pages)]
80
+ value << std + ["--vtxux", on_off(hyper.unrestricted_guest_mode)]
81
+ value << std + ["--accelerate3d", on_off(hyper.video_3d_acceleration)]
82
+ value << std + ["--firmware","efi"] if (hyper.use_efi)
83
+ value << std + ["--guestmemoryballoon", MiB(hyper.guest_balloon_size).to_s]
84
+ self.vboxmanage = value
85
+ end
86
+
87
+ # Convert a boolean to a on/off string
88
+ private
89
+ def on_off(value)
90
+ return "on" if (value)
91
+ return "off" if (!value)
92
+ end
93
+
94
+ end # VirtualBox
95
+
96
+ end # Virtual
97
+
98
+ end # PackerFiles
@@ -0,0 +1,75 @@
1
+ # Requires
2
+ require 'Virtual/VirtualBox'
3
+ require 'Utils/Generator'
4
+
5
+ # Converts a given OS into a VirtualBox builder
6
+ module PackerFiles
7
+ module Virtual
8
+ class VirtualBoxConverter
9
+
10
+ # Hash Value
11
+ attr_reader :value
12
+
13
+ # Constructor
14
+ def initialize(os, gen)
15
+ @value = convert(os, gen).to_hash
16
+ end
17
+
18
+ # Convert OS object into a hash
19
+ def convert(os, gen)
20
+ VirtualBox.new do |vbox|
21
+
22
+ # Fill in output directory and builder name
23
+ rel = os.CDImage.release
24
+ arch = os.CDImage.arch
25
+ name = os.name.gsub('::', '-')
26
+ vbox.output_directory = "output-#{name}-#{rel}-#{arch}-#{vbox.type}"
27
+ vbox.name = "#{name}-#{rel}-#{arch}-#{vbox.type}"
28
+
29
+ # Fill in image details, Some amount of url handling
30
+ # is really required to handle various corner cases.
31
+ # thus making the code a bit harder to understand
32
+ vbox.iso_checksum_type = os.CDImage.check_sum_type
33
+ vbox.iso_checksum = os.CDImage.check_sum
34
+
35
+ # The code below creates a user variable called mirror
36
+ # whose base value is the URL fragment w/o the file-name.
37
+ url = URI::parse(os.CDImage.iso_url)
38
+ file = File.basename(url.path)
39
+ url.path = File.dirname(url.path)
40
+ gen.variables['mirror'] = url.to_s
41
+ vbox.iso_url = "{{user `mirror`}}/#{file}"
42
+
43
+ # Fill in SSH specifics
44
+ vbox.ssh_username = os.User.login
45
+ vbox.ssh_password = os.User.password
46
+ vbox.ssh_wait_timeout = '10000s'
47
+
48
+ # Fill in other specifics
49
+ vbox.disk_size = os.Disk.size
50
+ vbox.http_directory = File.basename(os.http_dir)
51
+ vbox.guest_os_type = os.guest_os_type
52
+
53
+ # Fill in boot command and boot_wait timeout
54
+ gen.variables['host'] = ''
55
+ gen.variables['port'] = ''
56
+ user_var_name = name + "-#{vbox.type}-boot-wait"
57
+ gen.variables[user_var_name] = "10s"
58
+ vbox.boot_command = os.boot_command
59
+ vbox.boot_wait = "{{user `#{user_var_name}`}}"
60
+
61
+ # Fill in shutdown command
62
+ vbox.shutdown_command = os.shutdown_command
63
+
64
+ # Generate VBoxManage commands
65
+ vbox.Hypervisor(os.Hypervisors.VirtualBox)
66
+
67
+ # Finally do a Merge with custom
68
+ vbox.merge_hs(os.Hypervisors.VirtualBox.custom)
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,23 @@
1
+
2
+ # Define Hypervisors for this OS
3
+ <% if @obj.nil? -%>
4
+ #os.<%= @name -%> do |hypervisors|
5
+ <% else -%>
6
+ os.<%= @name -%> do |hypervisors|
7
+ <% end -%>
8
+
9
+ <%
10
+ content = []
11
+ %w[VirtualBox VMWare KVM].each do |func|
12
+ file = @mod.const_get('PackerFiles::Core::Hypervisor').doc_file
13
+ doc = @mod.evaluate_erb(file, {'name' => func})
14
+ content += doc.split("\n").map {|line| ' ' + line }
15
+ end
16
+ -%>
17
+ <%= content.join("\n") -%>
18
+
19
+ <% if @obj.nil? -%>
20
+ #end
21
+ <% else -%>
22
+ end
23
+ <% end -%>
@@ -0,0 +1,3 @@
1
+ module PackerFiles
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,44 @@
1
+ # Requires
2
+ require 'rubygems'
3
+ require 'erubis'
4
+
5
+ # Utility functions for the module
6
+ module PackerFiles
7
+
8
+ # Name of the gem of this module. This is useful elsewhere, but primarily
9
+ # to avoid multiple definitions of gem name everywhere.
10
+ @@gem = 'PackerFiles'
11
+
12
+ # Accessor for the Gem name
13
+ def self.GemName
14
+ @@gem
15
+ end
16
+
17
+ # Accessor for Gem Spec
18
+ def self.GemSpec
19
+ Gem::Specification.find_by_name(self.GemName)
20
+ end
21
+
22
+ # Given a Path, return it's absolute path within the context of the Gem
23
+ def self.DirPath(file_name)
24
+ self.GemSpec.matches_for_glob(file_name)
25
+ end
26
+
27
+ # Evaluate a given ERB file in a given OS folder with the object
28
+ # hash. The hash contains object bindings in the form of {var, obj}
29
+ # where {var} is present in the erb file.
30
+ def self.evaluate_erb(filename, hash)
31
+ return Erubis::Eruby.new(File.read(filename)).evaluate(hash)
32
+ end
33
+
34
+ # Top level function that is called by the DSL to generate all the
35
+ # required PackerFiles
36
+ def self.Generate(os_name, version = nil, &block)
37
+ require 'Finder'
38
+ finder = Finder.new
39
+ obj = finder.class_name(os_name, version).new(&block)
40
+ obj.Generate
41
+ end
42
+
43
+
44
+ end