instalatron 0.1.3 → 0.1.4
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/README.md +1 -1
- data/bin/instalatron-play +29 -3
- data/bin/instalatron-record +67 -9
- data/lib/instalatron.rb +28 -5
- metadata +25 -25
data/README.md
CHANGED
data/bin/instalatron-play
CHANGED
@@ -3,6 +3,7 @@ require 'fileutils'
|
|
3
3
|
require 'instalatron'
|
4
4
|
require 'yaml'
|
5
5
|
require 'mixlib/cli'
|
6
|
+
require 'logger'
|
6
7
|
|
7
8
|
def play_session(vm_name, script, custom_seq = nil, key_press_delay = 0)
|
8
9
|
ctrlc_gap = 0
|
@@ -90,7 +91,21 @@ class MyCLI
|
|
90
91
|
:long => "--key-press-delay SECS",
|
91
92
|
:description => "Delay between key presses",
|
92
93
|
:default => 0
|
93
|
-
|
94
|
+
|
95
|
+
option :nic_config,
|
96
|
+
:long => "--nic-config CFG",
|
97
|
+
:description => "VM NIC config (nic:device:mode)"
|
98
|
+
|
99
|
+
option :vm_memory,
|
100
|
+
:long => "--vm-memory MEM",
|
101
|
+
:description => "VM Memory",
|
102
|
+
:default => 512
|
103
|
+
|
104
|
+
option :vm_disk_size,
|
105
|
+
:long => "--vm-disk-size SIZE",
|
106
|
+
:description => "VM Disk Size in MB",
|
107
|
+
:default => 10024
|
108
|
+
|
94
109
|
option :help,
|
95
110
|
:short => "-h",
|
96
111
|
:long => "--help",
|
@@ -102,6 +117,8 @@ class MyCLI
|
|
102
117
|
|
103
118
|
end
|
104
119
|
|
120
|
+
Log = Logger.new($stdout)
|
121
|
+
|
105
122
|
cli = MyCLI.new
|
106
123
|
cli.parse_options
|
107
124
|
|
@@ -125,11 +142,20 @@ if not File.exist?(iso_file)
|
|
125
142
|
end
|
126
143
|
|
127
144
|
# Create VBox VM first
|
128
|
-
|
129
|
-
|
145
|
+
|
146
|
+
Log.debug "Creating VM #{vm_name}"
|
147
|
+
Instalatron.create_vm :vm_disk_size => cli.config[:vm_disk_size], :vm_memory => cli.config[:vm_memory], :vm_name => vm_name, :iso_file => iso_file, :headless => cli.config[:headless]
|
148
|
+
|
149
|
+
nic_config = cli.config[:nic_config]
|
150
|
+
if nic_config
|
151
|
+
nic, device, mode = nic_config.split ':'
|
152
|
+
Log.debug "Setting nic mode #{nic} #{device} #{mode}"
|
153
|
+
Instalatron.set_nic_mode(vm_name, nic, device, mode)
|
154
|
+
end
|
130
155
|
puts "Playing script using VM #{vm_name}\n\n"
|
131
156
|
play_session vm_name, script, cli.config[:custom_sequence], cli.config[:key_press_delay]
|
132
157
|
|
158
|
+
|
133
159
|
if cli.config[:destroy_vm]
|
134
160
|
puts "Unregistering and deleting VM #{vm_name}"
|
135
161
|
Instalatron.destroy_vm(vm_name)
|
data/bin/instalatron-record
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
2
3
|
require 'fileutils'
|
3
4
|
require 'instalatron'
|
4
5
|
require 'yaml'
|
6
|
+
require 'mixlib/cli'
|
5
7
|
|
6
8
|
def record_session(vm_name, session_name = "instalatron_rec_" + Time.now.strftime("%F_%H%M"))
|
7
9
|
puts "Recording session #{session_name}\n\n"
|
@@ -47,19 +49,75 @@ def record_session(vm_name, session_name = "instalatron_rec_" + Time.now.strftim
|
|
47
49
|
end
|
48
50
|
end
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
class MyCLI
|
53
|
+
include Mixlib::CLI
|
54
|
+
|
55
|
+
option :vm_name,
|
56
|
+
:short => "-n NAME",
|
57
|
+
:long => "--vm-name NAME",
|
58
|
+
:description => "Virtual Machine Name",
|
59
|
+
:default => "instalatron_#{Time.now.strftime('%s')}"
|
60
|
+
|
61
|
+
option :iso_file,
|
62
|
+
:short => "-i ISO",
|
63
|
+
:long => "--iso-file ISO",
|
64
|
+
:description => "ISO file to boot the VM with"
|
65
|
+
|
66
|
+
option :destroy_vm,
|
67
|
+
:long => "--destroy-vm",
|
68
|
+
:description => "Destroy the VM after running the tests"
|
69
|
+
|
70
|
+
option :vm_memory,
|
71
|
+
:long => "--vm-memory MEM",
|
72
|
+
:description => "VM Memory",
|
73
|
+
:default => 512
|
74
|
+
|
75
|
+
option :version,
|
76
|
+
:long => "--version",
|
77
|
+
:short => "-v",
|
78
|
+
:description => "Instalatron Version",
|
79
|
+
:proc => Proc.new { puts Instalatron::VERSION; exit 0 }
|
80
|
+
|
81
|
+
option :help,
|
82
|
+
:short => "-h",
|
83
|
+
:long => "--help",
|
84
|
+
:description => "Show this message",
|
85
|
+
:on => :tail,
|
86
|
+
:boolean => true,
|
87
|
+
:show_options => true,
|
88
|
+
:exit => 0
|
89
|
+
|
55
90
|
end
|
56
|
-
if not running_vms.include?(vm_name)
|
57
|
-
$stderr.puts "Running VM #{vm_name} not found.\n\n"
|
58
91
|
|
59
|
-
|
92
|
+
def usage(cli)
|
93
|
+
$stderr.puts cli.opt_parser.help
|
60
94
|
exit 1
|
61
95
|
end
|
62
96
|
|
63
|
-
|
97
|
+
def required_option(cli, opt)
|
98
|
+
if cli.config[opt].nil?
|
99
|
+
$stderr.puts "\n#{opt.to_s} argument requied.\n\n"
|
100
|
+
$stderr.puts cli.opt_parser.help
|
101
|
+
exit 1
|
102
|
+
end
|
103
|
+
return cli.config[opt]
|
104
|
+
end
|
105
|
+
|
106
|
+
cli = MyCLI.new
|
107
|
+
cli.parse_options
|
108
|
+
|
109
|
+
vm_name = cli.config[:vm_name]
|
110
|
+
|
111
|
+
iso_file = required_option(cli, :iso_file)
|
112
|
+
if not File.exist?(iso_file)
|
113
|
+
$stderr.puts "Invalid ISO file.\n\n"
|
114
|
+
usage(cli)
|
115
|
+
end
|
116
|
+
|
117
|
+
session_name = "instalatron_rec_" + Time.now.strftime("%F_%H%M")
|
118
|
+
|
119
|
+
# Create VBox VM first
|
120
|
+
$stdout.puts "Creating VM #{vm_name}..."
|
121
|
+
Instalatron.create_vm :vm_memory => cli.config[:vm_memory], :vm_name => vm_name, :iso_file => iso_file
|
64
122
|
|
65
123
|
record_session vm_name, session_name
|
data/lib/instalatron.rb
CHANGED
@@ -4,7 +4,29 @@ require 'virtualbox'
|
|
4
4
|
|
5
5
|
module Instalatron
|
6
6
|
|
7
|
-
VERSION = '0.1.
|
7
|
+
VERSION = '0.1.4'
|
8
|
+
|
9
|
+
#
|
10
|
+
# NIC is nic1, nic2, etc
|
11
|
+
# device is eth0, eth1, etc
|
12
|
+
# mode is either :nat, :bridged, :hostonly
|
13
|
+
#
|
14
|
+
def self.set_nic_mode(vm_name, nic, device, mode)
|
15
|
+
err = `VBoxManage controlvm #{vm_name} #{nic} #{mode.to_s} #{device} 2>&1`
|
16
|
+
puts err
|
17
|
+
raise Exception.new(err) if $? != 0
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.add_ssh_nat_mapping(vm_name, guest_port, host_port)
|
21
|
+
vm=VirtualBox::VM.find(vm_name)
|
22
|
+
port = VirtualBox::NATForwardedPort.new
|
23
|
+
port.name = "guestssh"
|
24
|
+
port.guestport = guest_port
|
25
|
+
port.hostport = host_port
|
26
|
+
vm.network_adapters[0].nat_driver.forwarded_ports << port
|
27
|
+
port.save
|
28
|
+
vm.save
|
29
|
+
end
|
8
30
|
|
9
31
|
def self.destroy_vm(vm_name)
|
10
32
|
`VBoxManage controlvm '#{vm_name}' poweroff > /dev/null 2>&1`
|
@@ -23,6 +45,7 @@ module Instalatron
|
|
23
45
|
vboxcmd = params[:vboxcmd] || 'VBoxManage'
|
24
46
|
vm_memory = params[:vm_memory] || 512
|
25
47
|
vm_cpus = params[:vm_cpus] || 1
|
48
|
+
vm_disk_size = params[:vm_disk_size].to_i || 8192
|
26
49
|
if params[:headless].nil?
|
27
50
|
params[:headless] = false
|
28
51
|
end
|
@@ -44,7 +67,7 @@ module Instalatron
|
|
44
67
|
end
|
45
68
|
|
46
69
|
vm=VirtualBox::VM.find(vm_name)
|
47
|
-
vm.memory_size= vm_memory
|
70
|
+
vm.memory_size = vm_memory.to_i
|
48
71
|
vm.os_type_id = os_type
|
49
72
|
vm.cpu_count = vm_cpus
|
50
73
|
vm.name = vm_name
|
@@ -60,7 +83,7 @@ module Instalatron
|
|
60
83
|
place = `#{vboxcmd} list systemproperties|grep '^Default machine'|cut -d ':' -f 2|sed -e 's/^[ ]*//'`.strip.chomp
|
61
84
|
disk_file = "#{place}/#{vm_name}/#{vm_name}.vdi"
|
62
85
|
|
63
|
-
`#{vboxcmd} createhd --filename '#{disk_file}' --size
|
86
|
+
`#{vboxcmd} createhd --filename '#{disk_file}' --size #{vm_disk_size} --format VDI >/dev/null 2>&1`
|
64
87
|
|
65
88
|
# Add IDE/Sata Controllers
|
66
89
|
`#{vboxcmd} storagectl '#{vm_name}' --name 'SATA Controller' --add sata --hostiocache off >/dev/null 2>&1`
|
@@ -83,7 +106,7 @@ module Instalatron
|
|
83
106
|
keycodes.split.each do |k|
|
84
107
|
`VBoxManage controlvm #{vm_name} keyboardputscancode '#{k}' >/dev/null 2>&1`
|
85
108
|
end
|
86
|
-
sleep key_press_delay.
|
109
|
+
sleep key_press_delay.to_f
|
87
110
|
end
|
88
111
|
end
|
89
112
|
|
@@ -94,7 +117,7 @@ module Instalatron
|
|
94
117
|
`VBoxManage controlvm #{vm_name} screenshotpng #{dest_file} >/dev/null 2>&1`
|
95
118
|
end
|
96
119
|
|
97
|
-
def self.same_image?(ref_image, new_img, threshold =
|
120
|
+
def self.same_image?(ref_image, new_img, threshold = 2000)
|
98
121
|
`file #{ref_image}` =~ /(\d+\sx\s\d+)/
|
99
122
|
geom1 = $1
|
100
123
|
`file #{new_img}` =~ /(\d+\sx\s\d+)/
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: instalatron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 4
|
10
|
+
version: 0.1.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Sergio Rubio
|
@@ -15,10 +15,10 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-07-11 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
|
21
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
22
22
|
none: false
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
@@ -29,12 +29,12 @@ dependencies:
|
|
29
29
|
- 0
|
30
30
|
- 0
|
31
31
|
version: 1.0.0
|
32
|
-
version_requirements: *id001
|
33
|
-
name: bundler
|
34
|
-
prerelease: false
|
35
32
|
type: :development
|
33
|
+
requirement: *id001
|
34
|
+
prerelease: false
|
35
|
+
name: bundler
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
|
37
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
38
38
|
none: false
|
39
39
|
requirements:
|
40
40
|
- - ~>
|
@@ -45,12 +45,12 @@ dependencies:
|
|
45
45
|
- 5
|
46
46
|
- 2
|
47
47
|
version: 1.5.2
|
48
|
-
version_requirements: *id002
|
49
|
-
name: jeweler
|
50
|
-
prerelease: false
|
51
48
|
type: :development
|
49
|
+
requirement: *id002
|
50
|
+
prerelease: false
|
51
|
+
name: jeweler
|
52
52
|
- !ruby/object:Gem::Dependency
|
53
|
-
|
53
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
54
54
|
none: false
|
55
55
|
requirements:
|
56
56
|
- - ">="
|
@@ -60,12 +60,12 @@ dependencies:
|
|
60
60
|
- 1
|
61
61
|
- 2
|
62
62
|
version: "1.2"
|
63
|
-
version_requirements: *id003
|
64
|
-
name: mixlib-cli
|
65
|
-
prerelease: false
|
66
63
|
type: :runtime
|
64
|
+
requirement: *id003
|
65
|
+
prerelease: false
|
66
|
+
name: mixlib-cli
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
|
-
|
68
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
69
69
|
none: false
|
70
70
|
requirements:
|
71
71
|
- - ">="
|
@@ -75,12 +75,12 @@ dependencies:
|
|
75
75
|
- 1
|
76
76
|
- 2
|
77
77
|
version: "1.2"
|
78
|
-
version_requirements: *id004
|
79
|
-
name: mixlib-cli
|
80
|
-
prerelease: false
|
81
78
|
type: :runtime
|
79
|
+
requirement: *id004
|
80
|
+
prerelease: false
|
81
|
+
name: mixlib-cli
|
82
82
|
- !ruby/object:Gem::Dependency
|
83
|
-
|
83
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
86
86
|
- - ">="
|
@@ -90,10 +90,10 @@ dependencies:
|
|
90
90
|
- 0
|
91
91
|
- 8
|
92
92
|
version: "0.8"
|
93
|
-
version_requirements: *id005
|
94
|
-
name: virtualbox
|
95
|
-
prerelease: false
|
96
93
|
type: :runtime
|
94
|
+
requirement: *id005
|
95
|
+
prerelease: false
|
96
|
+
name: virtualbox
|
97
97
|
description: Tests graphical installers using VirtualBox, keyboard driven input and image recognition technics
|
98
98
|
email: srubio@abiquo.com
|
99
99
|
executables:
|
@@ -148,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
148
|
requirements: []
|
149
149
|
|
150
150
|
rubyforge_project:
|
151
|
-
rubygems_version: 1.
|
151
|
+
rubygems_version: 1.8.5
|
152
152
|
signing_key:
|
153
153
|
specification_version: 3
|
154
154
|
summary: Abiquo Installer Testing Framework
|