esx 0.2.1 → 0.2.3
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/Gemfile +3 -3
- data/README.md +4 -0
- data/bin/esx +54 -34
- data/lib/esx.rb +8 -1
- data/spec/spec_helper.rb +27 -0
- data/spec/unit/host_spec.rb +21 -0
- metadata +28 -28
- data/test/helper.rb +0 -18
- data/test/test_esx.rb +0 -7
data/Gemfile
CHANGED
@@ -6,8 +6,8 @@ source "http://rubygems.org"
|
|
6
6
|
# Add dependencies to develop your gem here.
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
group :development do
|
9
|
-
gem "
|
9
|
+
gem "rspec", ">= 0"
|
10
10
|
gem "bundler", "~> 1.0.0"
|
11
|
-
gem "jeweler"
|
12
|
-
gem "
|
11
|
+
gem "jeweler"
|
12
|
+
gem "simplecov", ">= 0"
|
13
13
|
end
|
data/README.md
CHANGED
@@ -100,6 +100,10 @@ __esx create-vm --user root --password foo --name esx-rubiojr --disk-file /path/
|
|
100
100
|
|
101
101
|
end
|
102
102
|
|
103
|
+
# Testing
|
104
|
+
|
105
|
+
Run rspec from the base dir. By default, the tests try to connect to an ESX host named esx-test-host with user root and no password. Edit spec/spec_helper.rb to fit your needs.
|
106
|
+
|
103
107
|
# Copyright
|
104
108
|
|
105
109
|
Copyright (c) 2011 Sergio Rubio. See LICENSE.txt for
|
data/bin/esx
CHANGED
@@ -75,6 +75,7 @@ class CreateVMCommand < BaseCommand
|
|
75
75
|
|
76
76
|
parameter "ADDRESS", "ESX host address"
|
77
77
|
option "--disk-file", "DISK_FILE", "VMDK file to import", :attribute_name => :disk_file
|
78
|
+
option "--disk-size", "DISK_SIZE", "VM Disk size", :attribute_name => :disk_size, :default => 8192
|
78
79
|
option "--guest-id", "GUEST_ID", "GuestID value", :attribute_name => :guest_id, :default => 'otherGuest'
|
79
80
|
option "--name", "VM NAME", "Virtual Machine name (required)"
|
80
81
|
option "--memory", "MEMORY", "VM Memory size in MB", :default => 512
|
@@ -93,47 +94,58 @@ class CreateVMCommand < BaseCommand
|
|
93
94
|
end
|
94
95
|
exit 1
|
95
96
|
end
|
97
|
+
if disk_size and disk_file
|
98
|
+
$stderr.puts "Both --disk-file and --disk-size specified. --disk-size will be ignored."
|
99
|
+
end
|
96
100
|
downloaded_file = nil
|
97
|
-
|
98
|
-
|
101
|
+
if disk_file.nil?
|
102
|
+
# if --disk-file nil? create the VM without disk
|
103
|
+
vm = host.create_vm :vm_name => name,
|
104
|
+
:datastore => datastore, :disk_type => :flat, :memory => memory,
|
105
|
+
:disk_size => disk_size,
|
106
|
+
:guest_id => guest_id, :mac_address => mac_address
|
107
|
+
else
|
108
|
+
df = disk_file.dup
|
109
|
+
if df.strip.chomp =~ /^http/
|
110
|
+
begin
|
111
|
+
downloaded_file = disk_file.dup
|
112
|
+
tmpfile = "#{tmpdir}/#{Time.now.to_i}.esx"
|
113
|
+
puts "Downloading file... (#{tmpfile})"
|
114
|
+
download! downloaded_file, tmpfile
|
115
|
+
puts
|
116
|
+
df = tmpfile
|
117
|
+
rescue Exception => e
|
118
|
+
FileUtils.rm_f(tmpfile)
|
119
|
+
$stderr.puts "Error downloading file from #{downloaded_file}."
|
120
|
+
$stderr.puts e.message if debug?
|
121
|
+
exit 1
|
122
|
+
end
|
123
|
+
end
|
124
|
+
raise Exception.new("Invalid disk file") if not File.exist?(df)
|
125
|
+
if not name
|
126
|
+
$stderr.puts "Invalid VM name."
|
127
|
+
$stderr.puts "Use --name option to specify the VM name"
|
128
|
+
exit 1
|
129
|
+
end
|
130
|
+
host.remote_command "mkdir /vmfs/volumes/#{datastore}/#{name}"
|
131
|
+
|
99
132
|
begin
|
100
|
-
|
101
|
-
tmpfile = "#{tmpdir}/#{Time.now.to_i}.esx"
|
102
|
-
puts "Downloading file... (#{tmpfile})"
|
103
|
-
download! downloaded_file, tmpfile
|
104
|
-
puts
|
105
|
-
df = tmpfile
|
133
|
+
host.import_disk df, "/vmfs/volumes/#{datastore}/#{name}/#{name}.vmdk"
|
106
134
|
rescue Exception => e
|
107
|
-
|
108
|
-
$stderr.puts "Error downloading file from #{downloaded_file}."
|
135
|
+
$stderr.puts "Error uploading file to /vmfs/volumes/#{datastore}/#{name}/#{name}.vmdk"
|
109
136
|
$stderr.puts e.message if debug?
|
110
137
|
exit 1
|
111
138
|
end
|
112
|
-
end
|
113
|
-
raise Exception.new("Invalid disk file") if not File.exist?(df)
|
114
|
-
if not name
|
115
|
-
$stderr.puts "Invalid VM name."
|
116
|
-
$stderr.puts "Use --name option to specify the VM name"
|
117
|
-
exit 1
|
118
|
-
end
|
119
|
-
host.remote_command "mkdir /vmfs/volumes/#{datastore}/#{name}"
|
120
139
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
if not downloaded_file.nil?
|
130
|
-
puts "Deleting tmp file #{df}" if debug?
|
131
|
-
FileUtils.rm_f(df)
|
140
|
+
if not downloaded_file.nil?
|
141
|
+
puts "Deleting tmp file #{df}" if debug?
|
142
|
+
FileUtils.rm_f(df)
|
143
|
+
end
|
144
|
+
vm = host.create_vm :vm_name => name,
|
145
|
+
:disk_file => "#{name}/#{name}.vmdk",
|
146
|
+
:datastore => datastore, :disk_type => :flat, :memory => memory,
|
147
|
+
:guest_id => guest_id, :mac_address => mac_address
|
132
148
|
end
|
133
|
-
vm = host.create_vm :vm_name => name,
|
134
|
-
:disk_file => "#{name}/#{name}.vmdk",
|
135
|
-
:datastore => datastore, :disk_type => :flat, :memory => memory,
|
136
|
-
:guest_id => guest_id, :mac_address => mac_address
|
137
149
|
if poweron?
|
138
150
|
vm.power_on
|
139
151
|
end
|
@@ -195,4 +207,12 @@ class DefaultCommand < Clamp::Command
|
|
195
207
|
subcommand "create-vm", "Create a VM", CreateVMCommand
|
196
208
|
end
|
197
209
|
|
198
|
-
|
210
|
+
begin
|
211
|
+
DefaultCommand.run
|
212
|
+
rescue Exception => e
|
213
|
+
puts e.message
|
214
|
+
if $DEBUG
|
215
|
+
puts $!
|
216
|
+
puts $@
|
217
|
+
end
|
218
|
+
end
|
data/lib/esx.rb
CHANGED
@@ -6,7 +6,7 @@ require 'net/ssh'
|
|
6
6
|
|
7
7
|
module ESX
|
8
8
|
|
9
|
-
VERSION = '0.2.
|
9
|
+
VERSION = '0.2.3'
|
10
10
|
|
11
11
|
class Host
|
12
12
|
|
@@ -134,10 +134,13 @@ module ESX
|
|
134
134
|
}
|
135
135
|
]
|
136
136
|
}
|
137
|
+
|
138
|
+
# VMDK provided, replace the empty vmdk
|
137
139
|
vm_cfg[:deviceChange].push(create_disk_spec(:disk_file => spec[:disk_file],
|
138
140
|
:disk_type => spec[:disk_type],
|
139
141
|
:disk_size => spec[:disk_size],
|
140
142
|
:datastore => spec[:datastore]))
|
143
|
+
|
141
144
|
VM.wrap(@_datacenter.vmFolder.CreateVM_Task(:config => vm_cfg, :pool => @_datacenter.hostFolder.children.first.resourcePool).wait_for_completion)
|
142
145
|
end
|
143
146
|
|
@@ -337,6 +340,10 @@ module ESX
|
|
337
340
|
vm_object.Destroy_Task.wait_for_completion
|
338
341
|
end
|
339
342
|
|
343
|
+
def reset
|
344
|
+
vm_object.ResetVM_Task.wait_for_completion
|
345
|
+
end
|
346
|
+
|
340
347
|
def guest_info
|
341
348
|
GuestInfo.wrap(vm_object.guest)
|
342
349
|
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rspec/autorun'
|
3
|
+
require 'simplecov'
|
4
|
+
|
5
|
+
SimpleCov.start do
|
6
|
+
add_filter '/spec/'
|
7
|
+
end
|
8
|
+
|
9
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
10
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
11
|
+
require 'esx'
|
12
|
+
|
13
|
+
module ESXTestHelpers
|
14
|
+
|
15
|
+
def esx_host
|
16
|
+
"esx-test-host"
|
17
|
+
end
|
18
|
+
|
19
|
+
def esx_user
|
20
|
+
"root"
|
21
|
+
end
|
22
|
+
|
23
|
+
def esx_password
|
24
|
+
""
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "ESX host" do
|
4
|
+
include ESXTestHelpers
|
5
|
+
|
6
|
+
before do
|
7
|
+
@test_host = ESX::Host.connect(esx_host, esx_user, esx_password)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "connects to and ESX with a valid user/pass" do
|
11
|
+
host = nil
|
12
|
+
lambda do
|
13
|
+
host = ESX::Host.connect(esx_host, esx_user, esx_password)
|
14
|
+
end.should_not raise_error
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
it "retrives the host name" do
|
19
|
+
@test_host.name.should_not be_nil
|
20
|
+
end
|
21
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: esx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-11-
|
12
|
+
date: 2011-11-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement: &
|
15
|
+
name: rspec
|
16
|
+
requirement: &15484180 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *15484180
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
27
|
-
requirement: &
|
27
|
+
requirement: &15481960 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,21 +32,21 @@ dependencies:
|
|
32
32
|
version: 1.0.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *15481960
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: jeweler
|
38
|
-
requirement: &
|
38
|
+
requirement: &15495640 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
|
-
- -
|
41
|
+
- - ! '>='
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
43
|
+
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *15495640
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement: &
|
48
|
+
name: simplecov
|
49
|
+
requirement: &15492220 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *15492220
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: alchemist
|
60
|
-
requirement: &
|
60
|
+
requirement: &15503640 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *15503640
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rbvmomi
|
71
|
-
requirement: &
|
71
|
+
requirement: &15498460 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *15498460
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: terminal-table
|
82
|
-
requirement: &
|
82
|
+
requirement: &15511560 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *15511560
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: net-ssh
|
93
|
-
requirement: &
|
93
|
+
requirement: &15510000 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :runtime
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *15510000
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: net-scp
|
104
|
-
requirement: &
|
104
|
+
requirement: &15508740 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :runtime
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *15508740
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: clamp
|
115
|
-
requirement: &
|
115
|
+
requirement: &15507180 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,7 +120,7 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :runtime
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *15507180
|
124
124
|
description: Manage VMWare ESX hosts with ease
|
125
125
|
email: rubiojr@frameos.org
|
126
126
|
executables:
|
@@ -138,8 +138,8 @@ files:
|
|
138
138
|
- bin/esx
|
139
139
|
- examples/basics.rb
|
140
140
|
- lib/esx.rb
|
141
|
-
-
|
142
|
-
-
|
141
|
+
- spec/spec_helper.rb
|
142
|
+
- spec/unit/host_spec.rb
|
143
143
|
homepage: http://github.com/rubiojr/esx
|
144
144
|
licenses:
|
145
145
|
- MIT
|
data/test/helper.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler'
|
3
|
-
begin
|
4
|
-
Bundler.setup(:default, :development)
|
5
|
-
rescue Bundler::BundlerError => e
|
6
|
-
$stderr.puts e.message
|
7
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
-
exit e.status_code
|
9
|
-
end
|
10
|
-
require 'test/unit'
|
11
|
-
require 'shoulda'
|
12
|
-
|
13
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
15
|
-
require 'esx'
|
16
|
-
|
17
|
-
class Test::Unit::TestCase
|
18
|
-
end
|