veewee-to-packer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ /output
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in veewee-to-packer.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Mitchell Hashimoto
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # Veewee to Packer Template Converter
2
+
3
+ This is a RubyGem that will translate [Veewee](https://github.com/jedi4ever/veewee)
4
+ templates to [Packer](http://www.packer.io) templates. The conversion is
5
+ _perfect_. If 100% of the functionality can't be translated to the Packer
6
+ template, a warning or error message will be shown, depending on if its
7
+ critical or not.
8
+
9
+ ## Installation
10
+
11
+ Because Veewee is a RubyGem, so too is this converter. Installing using
12
+ RubyGems:
13
+
14
+ $ gem install veewee-to-packer
15
+
16
+ ## Usage
17
+
18
+ Usage is simple:
19
+
20
+ $ veewee-to-packer original-template.rb
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Trap interrupts to quit cleanly so they don't result in random stacktraces.
4
+ Signal.trap("INT") { exit 1 }
5
+
6
+ # Stdout/stderr should not buffer output
7
+ $stdout.sync = true
8
+ $stderr.sync = true
9
+
10
+ require 'optparse'
11
+
12
+ # Parse arguments
13
+ options = {
14
+ :builders => [],
15
+ :output => "output"
16
+ }
17
+
18
+ OptionParser.new do |opts|
19
+ opts.banner = "Usage: veewee-to-packer [options] TEMPLATE"
20
+
21
+ opts.on("--builder x,y,z", Array, "Builders to output template for.") do |builders|
22
+ options[:builders] = builders
23
+ end
24
+
25
+ opts.on("-o", "--output DIR", String, "Directory where files will be outputted.") do |output|
26
+ options[:output] = output
27
+ end
28
+ end.parse!
29
+
30
+ if ARGV.length != 1
31
+ $stderr.puts "ERROR: One argument must be given: the template to convert."
32
+ exit 1
33
+ end
34
+
35
+ # Do the actual conversion
36
+ require "veewee-to-packer"
37
+ begin
38
+ warnings = VeeweeToPacker.convert(ARGV[0], options[:output], options[:builders])
39
+
40
+ if !warnings.empty?
41
+ puts "There were some non-critical warnings during the conversion process."
42
+ puts "Your template will function despite these warnings, but they're noted"
43
+ puts "here so you can understand some aspects of the Veewee definition that"
44
+ puts "may not have carried over perfectly to the Packer template:"
45
+ puts
46
+ warnings.each do |warning|
47
+ puts "* #{warning}"
48
+ end
49
+ puts
50
+ end
51
+
52
+ puts "Success! Your Veewee definition was converted to a Packer template!"
53
+ puts "The template can be found in the `template.json` file in the output"
54
+ puts "directory: #{options[:output]}"
55
+ puts
56
+ puts "Please be sure to run `packer validate` against the new template"
57
+ puts "to verify settings are correct."
58
+ rescue VeeweeToPacker::Error => e
59
+ $stderr.puts "An error occurred:\n\n#{e}"
60
+ exit 1
61
+ end
@@ -0,0 +1,198 @@
1
+ module VeeweeToPacker
2
+ module Builders
3
+ class VirtualBox
4
+ GUESTOS_MAP ={
5
+ "Windows7_64"=>"Windows7_64",
6
+ "Windows7"=>"Windows7",
7
+ "Windows8"=>"Windows8",
8
+ "Windows8_64"=>"Windows8_64",
9
+ "WindowsNT"=>"WindowsNT",
10
+ "Windows2008"=>"Windows2008",
11
+ "Windows2008_64"=>"Windows2008_64",
12
+ "WindowsVista_64"=>"WindowsVista_64",
13
+ "WindowsVista"=>"WindowsVista",
14
+ "Windows2003"=>"Windows2003",
15
+ "Windows2003_64"=>"Windows2003_64",
16
+ "WindowsXP_64"=>"WindowsXP_64",
17
+ "WindowsXP"=>"WindowsXP",
18
+ "Windows2000"=>"Windows200",
19
+ "WindowsNT4"=>"WindowsNT4",
20
+ "WindowsMe"=>"WindowsMe",
21
+ "Windows98"=>"Windows98",
22
+ "Windows95"=>"Windows95",
23
+ "Windows31"=>"Windows31",
24
+ "Other"=>"Other",
25
+ "Other_64"=>"Other_64",
26
+ "FreeBSD"=>"FreeBSD",
27
+ "FreeBSD_64"=>"FreeBSD_64",
28
+ "Oracle"=>"Oracle",
29
+ "Oracle_64"=>"Oracle_64",
30
+ "Debian"=>"Debian",
31
+ "Debian_64"=>"Debian_64",
32
+ "Debian6"=>"Debian",
33
+ "Debian6_64"=>"Debian_64",
34
+ "Gentoo"=>"Gentoo",
35
+ "Gentoo_64"=>"Gentoo_64",
36
+ "Linux22"=>"Linux22",
37
+ "Linux24"=>"Linux24",
38
+ "Linux24_64"=>"Linux24_64",
39
+ "Linux26"=>"Linux26",
40
+ "Linux26_64"=>"Linux26_64",
41
+ "RedHat"=>"RedHat",
42
+ "RedHat_64"=>"RedHat_64",
43
+ "RedHat5"=>"RedHat",
44
+ "RedHat5_64"=>"RedHat_64",
45
+ "RedHat6"=>"RedHat",
46
+ "RedHat6_64"=>"RedHat_64",
47
+ "Centos"=>"RedHat",
48
+ "Centos_64"=>"RedHat_64",
49
+ "ArchLinux"=>"ArchLinux",
50
+ "ArchLinux_64"=>"ArchLinux_64",
51
+ "OpenSUSE"=>"OpenSUSE",
52
+ "OpenSUSE_64"=>"OpenSUSE_64",
53
+ "SUSE"=>"OpenSUSE",
54
+ "SUSE_64"=>"OpenSUSE_64",
55
+ "Fedora"=>"Fedora",
56
+ "Fedora_64"=>"Fedora_64",
57
+ "Ubuntu"=>"Ubuntu",
58
+ "Ubuntu_64"=>"Ubuntu_64",
59
+ "Linux"=>"Linux",
60
+ "Solaris"=>"Solaris",
61
+ "Solaris_64"=>"Solaris_64",
62
+ "Solaris9"=>"Solaris",
63
+ "Solaris7"=>"Solaris",
64
+ "Solaris8"=>"Solaris",
65
+ "OpenSolaris"=>"OpenSolaris",
66
+ "OpenSolaris_64"=>"OpenSolaris_64",
67
+ "OpenBSD"=>"OpenBSD",
68
+ "OpenBSD_64"=>"OpenBSD_64",
69
+ "NetBSD"=>"NetBSD",
70
+ "NetBSD_64"=>"NetBSD_64"
71
+ }
72
+
73
+ def self.name
74
+ "virtualbox"
75
+ end
76
+
77
+ def self.convert(input, input_dir, output_dir)
78
+ warnings =[]
79
+ builder = { "type" => "virtualbox" }
80
+
81
+ if input[:boot_cmd_sequence]
82
+ builder["boot_command"] = input.delete(:boot_cmd_sequence).map do |command|
83
+ command = command.gsub("<Esc>", "<esc>").
84
+ gsub("<Enter>", "<enter>").
85
+ gsub("<Return>", "<return>").
86
+ gsub("<Tab>", "<tab>").
87
+ gsub("%IP%", "{{ .HTTPIP }}").
88
+ gsub("%PORT%", "{{ .HTTPPort }}")
89
+
90
+ # We insert a wait after every command because that is the behavior
91
+ # of Veewee
92
+ "#{command}<wait>"
93
+ end
94
+ end
95
+
96
+ if input[:boot_wait]
97
+ builder["boot_wait"] = "#{input.delete(:boot_wait)}s"
98
+ end
99
+
100
+ if input[:disk_size]
101
+ builder["disk_size"] = input.delete(:disk_size).to_i
102
+ end
103
+
104
+ if input[:os_type_id]
105
+ guestos_id = input.delete(:os_type_id)
106
+ guestos = GUESTOS_MAP[guestos_id]
107
+ if !guestos
108
+ guestos = "other"
109
+ warnings << "Unknown guest OS type: '#{guestos_id}'. Using 'other'."
110
+ end
111
+
112
+ builder["guest_os_type"] = guestos
113
+ end
114
+
115
+ if input[:kickstart_file]
116
+ http_dir = output_dir.join("http")
117
+ http_dir.mkpath
118
+
119
+ kickstart_file = input.delete(:kickstart_file)
120
+ kickstart_file = [kickstart_file] if !kickstart_file.is_a?(Array)
121
+
122
+ kickstart_file.each do |single_file|
123
+ kickstart_file_src = Pathname.new(File.expand_path(single_file, input_dir))
124
+ kickstart_file_dest = http_dir.join(kickstart_file_src.basename)
125
+ FileUtils.cp(kickstart_file_src, kickstart_file_dest)
126
+ end
127
+
128
+ builder["http_directory"] = "http"
129
+ end
130
+
131
+ if input[:iso_download_instructions]
132
+ warnings << "ISO download instructions: #{input.delete(:iso_download_instructions)}"
133
+ end
134
+
135
+ builder["iso_md5"] = input.delete(:iso_md5)
136
+ builder["iso_url"] = input.delete(:iso_src)
137
+
138
+ builder["ssh_username"] = input.delete(:ssh_user) if input[:ssh_user]
139
+ builder["ssh_password"] = input.delete(:ssh_password) if input[:ssh_password]
140
+ builder["ssh_port"] = input.delete(:ssh_guest_port).to_i if input[:ssh_guest_port]
141
+ builder["ssh_wait_timeout"] = "#{input.delete(:ssh_login_timeout)}s" if input[:ssh_login_timeout]
142
+
143
+ builder["shutdown_command"] = input.delete(:shutdown_cmd) if input[:shutdown_cmd]
144
+ if builder["shutdown_command"] && input[:sudo_cmd]
145
+ sudo_command = input.delete(:sudo_cmd).
146
+ gsub("%p", builder["ssh_password"]).
147
+ gsub("%f", "shutdown.sh")
148
+
149
+ builder["shutdown_command"] = "echo '#{builder["shutdown_command"]}' > shutdown.sh; #{sudo_command}"
150
+ end
151
+
152
+ builder["guest_additions_path"] = "VBoxGuestAdditions_{{.Version}}.iso"
153
+ builder["virtualbox_version_file"] = ".vbox_version"
154
+
155
+ builder["vboxmanage"] = []
156
+
157
+ if input[:memory_size]
158
+ builder["vboxmanage"] << [
159
+ "modifyvm", "{{.Name}}", "--memory", input.delete(:memory_size)]
160
+ end
161
+
162
+ if input[:cpu_count]
163
+ builder["vboxmanage"] << [
164
+ "modifyvm", "{{.Name}}", "--cpus", input.delete(:cpu_count)]
165
+ end
166
+
167
+ # Taken directly from Veewee, all the flags that VirtualBox definitions
168
+ # can have.
169
+ vm_flags = %w{pagefusion acpi ioapic pae hpet hwvirtex hwvirtexcl nestedpaging largepages vtxvpid synthxcpu rtcuseutc}
170
+ vm_flags.each do |flag|
171
+ if input[flag.to_sym]
172
+ builder["vboxmanage"] << [
173
+ "modifyvm", "{{.Name}}",
174
+ "--#{flag}",
175
+ input.delete(flag.to_sym)
176
+ ]
177
+ end
178
+ end
179
+
180
+ # These are unused, so just ignore them.
181
+ input.delete(:disk_format)
182
+ input.delete(:hostiocache)
183
+ input.delete(:kickstart_port)
184
+ input.delete(:kickstart_timeout)
185
+ input.delete(:iso_download_timeout)
186
+ input.delete(:iso_file)
187
+ input.delete(:ssh_host_port)
188
+ input.delete(:ssh_key)
189
+
190
+ if input.length > 0
191
+ raise Error, "Uknown keys: #{input.keys.sort.inspect}"
192
+ end
193
+
194
+ [builder, warnings]
195
+ end
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,183 @@
1
+ require "fileutils"
2
+
3
+ module VeeweeToPacker
4
+ module Builders
5
+ class VMware
6
+ GUESTOS_MAP ={
7
+ "Windows7_64"=>"windows7-64",
8
+ "Windows7"=>"windows7",
9
+ "WindowsNT"=>"winNT",
10
+ "Windows2008"=>"longhorn",
11
+ "Windows2008_64"=>"longhorn-64",
12
+ "WindowsVista_64"=>"winvista-64",
13
+ "WindowsVista"=>"winvista",
14
+ "Windows2003"=>"winnetstandard",
15
+ "Windows2003_64"=>"winnetstandard-64",
16
+ "WindowsXP_64"=>"winXPPro-64",
17
+ "WindowsXP"=>"winXP",
18
+ "Other"=>"other",
19
+ "Other_64"=>"other-64",
20
+ "FreeBSD"=>"freeBSD",
21
+ "FreeBSD_64"=>"freebsd-64",
22
+ "Oracle"=>"oraclelinux",
23
+ "Oracle_64"=>"oraclelinux-64",
24
+ "Debian"=>"debian5",
25
+ "Debian_64"=>"debian5-64",
26
+ "Debian6"=>"debian6",
27
+ "Debian6_64"=>"debian6-64",
28
+ "Gentoo"=>"other26xlinux",
29
+ "Gentoo_64"=>"other26xlinux-64",
30
+ "Linux22"=>"linux",
31
+ "Linux24"=>"other24xlinux",
32
+ "Linux24_64"=>"other24xlinux-64",
33
+ "Linux26"=>"other26xlinux",
34
+ "Linux26_64"=>"other26xlinux-64",
35
+ "RedHat"=>"RedHat",
36
+ "RedHat_64"=>"RedHat_64",
37
+ "RedHat5"=>"rhel5",
38
+ "RedHat5_64"=>"rhel5-64",
39
+ "RedHat6"=>"rhel6",
40
+ "RedHat6_64"=>"rhel6-64",
41
+ "Centos"=>"centos",
42
+ "Centos_64"=>"centos-64",
43
+ "ArchLinux"=>"other26xlinux",
44
+ "ArchLinux_64"=>"other26xlinux-64",
45
+ "OpenSUSE"=>"opensuse",
46
+ "OpenSUSE_64"=>"opensuse-64",
47
+ "SUSE"=>"suse",
48
+ "SUSE_64"=>"suse-64",
49
+ "SLES11"=>"sles11",
50
+ "SLES11_64"=>"sles11-64",
51
+ "Fedora"=>"fedora",
52
+ "Fedora_64"=>"fedora-64",
53
+ "Ubuntu"=>"ubuntu",
54
+ "Ubuntu_64"=>"ubuntu-64",
55
+ "Linux"=>"linux",
56
+ "Solaris"=>"solaris10",
57
+ "Solaris_64"=>"solaris10-64",
58
+ "Solaris9"=>"solaris",
59
+ "Solaris7"=>"solaris7",
60
+ "Solaris8"=>"solaris8",
61
+ "OpenSolaris"=>"solaris10",
62
+ "OpenSolaris_64"=>"solaris-64",
63
+ "OpenBSD"=>"other",
64
+ "OpenBSD_64"=>"other-64",
65
+ "NetBSD"=>"other",
66
+ "NetBSD_64"=>"other-64",
67
+ "ESXi5"=>"vmkernel5",
68
+ "Darwin_10_7"=>"darwin11",
69
+ "Darwin_10_7_64"=>"darwin11-64",
70
+ "Darwin_10_8_64"=>"darwin12-64"
71
+ }
72
+
73
+ def self.name
74
+ "vmware"
75
+ end
76
+
77
+ def self.convert(input, input_dir, output_dir)
78
+ warnings = []
79
+ builder = { "type" => "vmware" }
80
+
81
+ if input[:boot_cmd_sequence]
82
+ builder["boot_command"] = input.delete(:boot_cmd_sequence).map do |command|
83
+ command = command.gsub("<Esc>", "<esc>").
84
+ gsub("<Enter>", "<enter>").
85
+ gsub("<Return>", "<return>").
86
+ gsub("<Tab>", "<tab>").
87
+ gsub("%IP%", "{{ .HTTPIP }}").
88
+ gsub("%PORT%", "{{ .HTTPPort }}")
89
+
90
+ # We insert a wait after every command because that is the behavior
91
+ # of Veewee
92
+ "#{command}<wait>"
93
+ end
94
+ end
95
+
96
+ if input[:boot_wait]
97
+ builder["boot_wait"] = "#{input.delete(:boot_wait)}s"
98
+ end
99
+
100
+ if input[:disk_size]
101
+ builder["disk_size"] = input.delete(:disk_size).to_i
102
+ end
103
+
104
+ if input[:os_type_id]
105
+ guestos_id = input.delete(:os_type_id)
106
+ guestos = GUESTOS_MAP[guestos_id]
107
+ if !guestos
108
+ guestos = "other"
109
+ warnings << "Unknown guest OS type: '#{guestos_id}'. Using 'other'."
110
+ end
111
+
112
+ builder["guest_os_type"] = guestos
113
+ end
114
+
115
+ if input[:kickstart_file]
116
+ http_dir = output_dir.join("http")
117
+ http_dir.mkpath
118
+
119
+ kickstart_file = input.delete(:kickstart_file)
120
+ kickstart_file = [kickstart_file] if !kickstart_file.is_a?(Array)
121
+
122
+ kickstart_file.each do |single_file|
123
+ kickstart_file_src = Pathname.new(File.expand_path(single_file, input_dir))
124
+ kickstart_file_dest = http_dir.join(kickstart_file_src.basename)
125
+ FileUtils.cp(kickstart_file_src, kickstart_file_dest)
126
+ end
127
+
128
+ builder["http_directory"] = "http"
129
+ end
130
+
131
+ if input[:iso_download_instructions]
132
+ warnings << "ISO download instructions: #{input.delete(:iso_download_instructions)}"
133
+ end
134
+
135
+ builder["iso_md5"] = input.delete(:iso_md5)
136
+ builder["iso_url"] = input.delete(:iso_src)
137
+
138
+ builder["ssh_username"] = input.delete(:ssh_user) if input[:ssh_user]
139
+ builder["ssh_password"] = input.delete(:ssh_password) if input[:ssh_password]
140
+ builder["ssh_port"] = input.delete(:ssh_guest_port).to_i if input[:ssh_guest_port]
141
+ builder["ssh_wait_timeout"] = "#{input.delete(:ssh_login_timeout)}s" if input[:ssh_login_timeout]
142
+
143
+ builder["shutdown_command"] = input.delete(:shutdown_cmd) if input[:shutdown_cmd]
144
+ if builder["shutdown_command"] && input[:sudo_cmd]
145
+ sudo_command = input.delete(:sudo_cmd).
146
+ gsub("%p", builder["ssh_password"]).
147
+ gsub("%f", "shutdown.sh")
148
+
149
+ builder["shutdown_command"] = "echo '#{builder["shutdown_command"]}' > shutdown.sh; #{sudo_command}"
150
+ end
151
+
152
+ builder["vmx_data"] = {}
153
+
154
+ if input[:memory_size]
155
+ builder["vmx_data"]["memsize"] = input.delete(:memory_size)
156
+ end
157
+
158
+ if input[:cpu_count]
159
+ builder["vmx_data"]["numvcpus"] = input.delete(:cpu_count)
160
+ builder["vmx_data"]["cpuid.coresPerSocket"] = "1"
161
+ end
162
+
163
+ # These are unused, so just ignore them.
164
+ input.delete(:disk_format)
165
+ input.delete(:ioapic)
166
+ input.delete(:kickstart_port)
167
+ input.delete(:kickstart_timeout)
168
+ input.delete(:hostiocache)
169
+ input.delete(:iso_download_timeout)
170
+ input.delete(:iso_file)
171
+ input.delete(:pae)
172
+ input.delete(:ssh_host_port)
173
+ input.delete(:ssh_key)
174
+
175
+ if input.length > 0
176
+ raise Error, "Uknown keys: #{input.keys.sort.inspect}"
177
+ end
178
+
179
+ [builder, warnings]
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,6 @@
1
+ module VeeweeToPacker
2
+ # All errors are wrapped in this so that they can be shown in a
3
+ # human-friendly way by the CLI.
4
+ class Error < StandardError
5
+ end
6
+ end
@@ -0,0 +1,20 @@
1
+ # This file contains mocked out Veewee classes in order to load
2
+ # a Veewee definition into a format we like.
3
+
4
+ module Veewee
5
+ class Definition
6
+ @@captured = nil
7
+
8
+ def self.captured
9
+ @@captured
10
+ end
11
+
12
+ def self.declare(options)
13
+ @@captured = options
14
+ end
15
+ end
16
+
17
+ # Some templates also use "Veewee::Session" so we just alias that
18
+ # to the same thing.
19
+ Session = Definition
20
+ end
@@ -0,0 +1,3 @@
1
+ module VeeweeToPacker
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,118 @@
1
+ require "fileutils"
2
+ require "json"
3
+ require "pathname"
4
+
5
+ require "veewee-to-packer/builders/virtualbox"
6
+ require "veewee-to-packer/builders/vmware"
7
+ require "veewee-to-packer/error"
8
+ require "veewee-to-packer/mock_veewee"
9
+ require "veewee-to-packer/version"
10
+
11
+ module VeeweeToPacker
12
+ BUILDERS = {
13
+ "virtualbox" => Builders::VirtualBox,
14
+ "vmware" => Builders::VMware
15
+ }
16
+
17
+ # Converts the given Veewee template into a Packer template, outputting
18
+ # the JSON to the given output path. The builders that the template will
19
+ # contain is specified by `builders`.
20
+ def self.convert(input, output, builders)
21
+ builders = builders.map do |builder|
22
+ klass = BUILDERS[builder.downcase]
23
+ raise Error, "No such builder: #{builder}" if !klass
24
+ klass
25
+ end
26
+
27
+ # Make the output directory
28
+ output = Pathname.new(output)
29
+ output.mkpath
30
+
31
+ # Determine the directory where the template is
32
+ input_dir = Pathname.new(input).parent
33
+
34
+ # Load the definition file and capture its configuration
35
+ begin
36
+ load input
37
+ rescue LoadError => e
38
+ raise Error, "Error loading input template: #{e}"
39
+ end
40
+
41
+ definition = Veewee::Definition.captured
42
+
43
+ # This will keep track of any warnings (errors are raised) that
44
+ # we have during the conversion process.
45
+ warnings = []
46
+
47
+ # This will be the packer template contents that we'll turn to JSON
48
+ template = {}
49
+
50
+ # First, convert the postinstall_files into a shell provisioning step
51
+ if definition[:postinstall_files]
52
+ provisioner = { "type" => "shell" }
53
+ provisioner["scripts"] = definition.delete(:postinstall_files).map do |script|
54
+ scripts_dir = output.join("scripts")
55
+ scripts_dir.mkpath
56
+
57
+ script_file_src = Pathname.new(File.expand_path(script, input_dir))
58
+ script_file_dest = scripts_dir.join(script_file_src.basename)
59
+
60
+ FileUtils.cp(script_file_src, script_file_dest)
61
+
62
+ "scripts/#{script_file_dest.basename}"
63
+ end
64
+
65
+ if definition[:sudo_cmd]
66
+ override = {}
67
+ provisioner["override"] = override
68
+
69
+ builders.each do |builder|
70
+ execute_command = definition[:sudo_cmd].
71
+ gsub("%p", definition[:ssh_password]).
72
+ gsub("%f", "{{.Path}}")
73
+
74
+ override[builder.name] = {
75
+ "execute_command" => execute_command
76
+ }
77
+ end
78
+ end
79
+
80
+ template["provisioners"] = [provisioner]
81
+
82
+ # Unused fields
83
+ if definition[:postinstall_timeout]
84
+ definition.delete(:postinstall_timeout)
85
+ warnings << "':postinstall_timeout' doesn't exist in Packer."
86
+ end
87
+ end
88
+
89
+ # Some overall things
90
+ if definition[:hooks]
91
+ definition.delete(:hooks)
92
+ warnings << ":hooks are not supported by Packer."
93
+ end
94
+
95
+ if definition[:params]
96
+ definition.delete(:params)
97
+ warnings << ":params are not supported by Packer."
98
+ end
99
+
100
+ # Build the builders
101
+ template["builders"] = builders.map do |builder|
102
+ config, build_warnings = builder.convert(definition.dup, input_dir, output)
103
+ if build_warnings && !build_warnings.empty?
104
+ build_warnings.each do |warning|
105
+ warnings << "Builder '#{builder.name}': #{warning}"
106
+ end
107
+ end
108
+
109
+ config
110
+ end
111
+
112
+ output.join("template.json").open("w") do |f|
113
+ f.write(JSON.pretty_generate(template))
114
+ end
115
+
116
+ warnings
117
+ end
118
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'veewee-to-packer/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "veewee-to-packer"
8
+ gem.version = VeeweeToPacker::VERSION
9
+ gem.authors = ["Mitchell Hashimoto"]
10
+ gem.email = ["mitchell.hashimoto@gmail.com"]
11
+ gem.description = %q{Converts Veewee templates to Packer templates.}
12
+ gem.summary = %q{Converts Veewee templates to Packer templates perfectly.}
13
+ gem.homepage = "https://github.com/mitchellh/veewee-to-packer"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: veewee-to-packer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Mitchell Hashimoto
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-28 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Converts Veewee templates to Packer templates.
15
+ email:
16
+ - mitchell.hashimoto@gmail.com
17
+ executables:
18
+ - veewee-to-packer
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - .gitignore
23
+ - Gemfile
24
+ - LICENSE.txt
25
+ - README.md
26
+ - Rakefile
27
+ - bin/veewee-to-packer
28
+ - lib/veewee-to-packer.rb
29
+ - lib/veewee-to-packer/builders/virtualbox.rb
30
+ - lib/veewee-to-packer/builders/vmware.rb
31
+ - lib/veewee-to-packer/error.rb
32
+ - lib/veewee-to-packer/mock_veewee.rb
33
+ - lib/veewee-to-packer/version.rb
34
+ - veewee-to-packer.gemspec
35
+ homepage: https://github.com/mitchellh/veewee-to-packer
36
+ licenses: []
37
+ post_install_message:
38
+ rdoc_options: []
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 1.8.23
56
+ signing_key:
57
+ specification_version: 3
58
+ summary: Converts Veewee templates to Packer templates perfectly.
59
+ test_files: []
60
+ has_rdoc: