lab-manager 1.0.7 → 1.0.8
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/bin/lab_checkout.sh +27 -0
- data/bin/lab_clone.sh +27 -0
- data/bin/lab_delete.sh +26 -0
- data/lib/lab_manager.rb +159 -34
- data/lib/lab_manager/configuration.rb +23 -0
- metadata +49 -62
data/bin/lab_checkout.sh
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# ##########################################################################################
|
3
|
+
# lab_checkout.rb
|
4
|
+
#
|
5
|
+
# bin/lab_checkout.rb "ORG" "WORKSPACE" "CONFIGURATION" "NEW CONFIGURATION"
|
6
|
+
# ##########################################################################################
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
$:.unshift "#{File.dirname(__FILE__)}/../lib"
|
10
|
+
require "lab_manager"
|
11
|
+
|
12
|
+
if (ARGV.size < 4)
|
13
|
+
puts "usage: #{File.basename __FILE__} <organization> <workspace> <configuration> <new configuration>"
|
14
|
+
Process.exit(1)
|
15
|
+
end
|
16
|
+
|
17
|
+
organization = ARGV[0]
|
18
|
+
workspace = ARGV[1]
|
19
|
+
configuration = ARGV[2]
|
20
|
+
new_configuration = ARGV[3]
|
21
|
+
|
22
|
+
lab = LabManager.new(organization)
|
23
|
+
lab.workspace = workspace
|
24
|
+
lab.checkout(configuration, new_configuration)
|
25
|
+
|
26
|
+
puts "Clone of library complete"
|
27
|
+
|
data/bin/lab_clone.sh
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# ##########################################################################################
|
3
|
+
# lab_clone.rb
|
4
|
+
#
|
5
|
+
# bin/lab_clone.rb "ORG" "WORKSPACE" "CONFIGURATION" "NEW CONFIGURATION"
|
6
|
+
# ##########################################################################################
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
$:.unshift "#{File.dirname(__FILE__)}/../lib"
|
10
|
+
require "lab_manager"
|
11
|
+
|
12
|
+
if (ARGV.size < 4)
|
13
|
+
puts "usage: #{File.basename __FILE__} <organization> <workspace> <configuration> <new configuration>"
|
14
|
+
Process.exit(1)
|
15
|
+
end
|
16
|
+
|
17
|
+
organization = ARGV[0]
|
18
|
+
workspace = ARGV[1]
|
19
|
+
configuration = ARGV[2]
|
20
|
+
new_configuration = ARGV[3]
|
21
|
+
|
22
|
+
lab = LabManager.new(organization)
|
23
|
+
lab.workspace = workspace
|
24
|
+
lab.clone(configuration, new_configuration)
|
25
|
+
|
26
|
+
puts "Clone complete"
|
27
|
+
|
data/bin/lab_delete.sh
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# ##########################################################################################
|
3
|
+
# lab_delete.rb
|
4
|
+
#
|
5
|
+
# bin/lab_delete.rb "ORG" "WORKSPACE" "CONFIGURATION"
|
6
|
+
# ##########################################################################################
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
$:.unshift "#{File.dirname(__FILE__)}/../lib"
|
10
|
+
require "lab_manager"
|
11
|
+
|
12
|
+
if (ARGV.size < 3)
|
13
|
+
puts "usage: #{File.basename __FILE__} <organization> <workspace> <configuration>"
|
14
|
+
Process.exit(1)
|
15
|
+
end
|
16
|
+
|
17
|
+
organization = ARGV[0]
|
18
|
+
workspace = ARGV[1]
|
19
|
+
configuration = ARGV[2]
|
20
|
+
|
21
|
+
lab = LabManager.new(organization)
|
22
|
+
lab.workspace = workspace
|
23
|
+
lab.delete(configuration)
|
24
|
+
|
25
|
+
puts "Delete complete"
|
26
|
+
|
data/lib/lab_manager.rb
CHANGED
@@ -5,8 +5,10 @@ require 'soap/element'
|
|
5
5
|
require 'soap/netHttpClient'
|
6
6
|
require 'xsd/datatypes'
|
7
7
|
require 'yaml'
|
8
|
+
require 'ostruct'
|
8
9
|
|
9
10
|
require 'lab_manager/machine'
|
11
|
+
require 'lab_manager/configuration'
|
10
12
|
|
11
13
|
require 'lab_manager/httpclient_patch'
|
12
14
|
|
@@ -65,32 +67,53 @@ class LabManager
|
|
65
67
|
@organization = organization
|
66
68
|
end
|
67
69
|
|
68
|
-
|
69
|
-
#
|
70
|
-
|
71
|
-
#
|
72
|
-
|
73
|
-
#
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
83
|
-
#
|
84
|
-
#
|
85
|
-
#
|
86
|
-
#
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
90
|
-
|
91
|
-
|
70
|
+
# Retrieve configuration information
|
71
|
+
#
|
72
|
+
# ==== XML Sample
|
73
|
+
#
|
74
|
+
# <GetConfigurationByName xmlns="http://vmware.com/labmanager">
|
75
|
+
# <name>string</name>
|
76
|
+
# </GetConfigurationByName>
|
77
|
+
#
|
78
|
+
# <GetConfigurationByNameResponse xmlns="http://vmware.com/labmanager">
|
79
|
+
# <GetConfigurationByNameResult>
|
80
|
+
# <Configuration>
|
81
|
+
# <id>int</id>
|
82
|
+
# <name>string</name>
|
83
|
+
# <description>string</description>
|
84
|
+
# <isPublic>boolean</isPublic>
|
85
|
+
# <isDeployed>boolean</isDeployed>
|
86
|
+
# <fenceMode>int</fenceMode>
|
87
|
+
# <type>int</type>
|
88
|
+
# <owner>string</owner>
|
89
|
+
# <dateCreated>dateTime</dateCreated>
|
90
|
+
# <autoDeleteInMilliSeconds>double</autoDeleteInMilliSeconds>
|
91
|
+
# <bucketName>string</bucketName>
|
92
|
+
# <mustBeFenced>NotSpecified or True or False</mustBeFenced>
|
93
|
+
# <autoDeleteDateTime>dateTime</autoDeleteDateTime>
|
94
|
+
# </Configuration>
|
95
|
+
#
|
96
|
+
# * name_or_id can be a configuration name or a configuration id returned
|
97
|
+
# by another method. An id is identified as only digits.
|
98
|
+
#
|
99
|
+
def configuration(name_or_id)
|
100
|
+
if name_or_id =~ /^\d+$/
|
101
|
+
config_data = proxy.GetConfiguration(:configurationId => name_or_id)
|
102
|
+
else
|
103
|
+
config_data = proxy.GetConfigurationByName(:name => name_or_id)
|
104
|
+
end
|
105
|
+
Configuration.parse(config_data)
|
106
|
+
end
|
107
|
+
|
108
|
+
# Retrieve a list of configuration information
|
109
|
+
def configurations()
|
110
|
+
proxy.ListConfigurations(:configurationType => 2)
|
92
111
|
end
|
93
112
|
|
113
|
+
# Retrieve a list of machines in a configuration
|
114
|
+
#
|
115
|
+
# ==== XML Sample
|
116
|
+
#
|
94
117
|
# <ListMachines xmlns="http://vmware.com/labmanager">
|
95
118
|
# <configurationId>int</configurationId>
|
96
119
|
# </ListMachines>
|
@@ -112,15 +135,18 @@ class LabManager
|
|
112
135
|
# <HostNameDeployedOn>string</HostNameDeployedOn>
|
113
136
|
# <OwnerFullName>string</OwnerFullName>
|
114
137
|
# </Machine>
|
138
|
+
#
|
139
|
+
# * configuration_name
|
140
|
+
#
|
141
|
+
# ==== Examples
|
115
142
|
#
|
116
143
|
# lab_manager.machines("CONFIG NAME")
|
117
144
|
# lab_manager.machines("CONFIG NAME", :exclude => ["machine name"])
|
118
145
|
#
|
119
|
-
def machines(
|
120
|
-
|
121
|
-
configurationId = configuration["GetConfigurationByNameResult"]["Configuration"]["id"]
|
146
|
+
def machines(configuration_name, options = {})
|
147
|
+
config = configuration(configuration_name)
|
122
148
|
|
123
|
-
data = proxy.ListMachines(:configurationId =>
|
149
|
+
data = proxy.ListMachines(:configurationId => config.id)
|
124
150
|
|
125
151
|
machines = Machine.from_list(data)
|
126
152
|
|
@@ -133,13 +159,109 @@ class LabManager
|
|
133
159
|
machines
|
134
160
|
end
|
135
161
|
|
136
|
-
|
137
|
-
|
162
|
+
# Retrieve the informaiton for a single machine in a configuration
|
163
|
+
def machine(configuration_name, machineName)
|
164
|
+
machines(configuration_name).find { |machine|
|
138
165
|
machine.name == machineName
|
139
166
|
}
|
140
167
|
end
|
141
168
|
|
169
|
+
# Clones a configuration from a library.
|
170
|
+
#
|
171
|
+
# ==== XML Samples
|
172
|
+
#
|
173
|
+
# <ConfigurationCheckout xmlns:n1="http://vmware.com/labmanager">
|
174
|
+
# <configurationId>1138</configurationId>
|
175
|
+
# <workspaceName>NEW TEST CONFIG</workspaceName>
|
176
|
+
# </ConfigurationCheckout>
|
177
|
+
#
|
178
|
+
# * configuration_name to clone from the library
|
179
|
+
# * new_configuration_name to clone to
|
180
|
+
#
|
181
|
+
# return the new configuration id
|
182
|
+
#
|
183
|
+
def checkout(configuration_name, new_configuration_name)
|
184
|
+
config = configuration(configuration_name)
|
185
|
+
|
186
|
+
data = proxy.ConfigurationCheckout(
|
187
|
+
:configurationId => config.id,
|
188
|
+
:workspaceName => new_configuration_name)
|
189
|
+
data["ConfigurationCheckoutResult"]
|
190
|
+
end
|
191
|
+
|
192
|
+
# Clone a configuration to a new name
|
193
|
+
#
|
194
|
+
# ==== XML Sample
|
195
|
+
#
|
196
|
+
# <ConfigurationClone xmlns="http://vmware.com/labmanager">
|
197
|
+
# <configurationId>int</configurationId>
|
198
|
+
# <newWorkspaceName>string</newWorkspaceName>
|
199
|
+
# </ConfigurationClone>
|
200
|
+
#
|
201
|
+
# <ConfigurationCloneResponse xmlns="http://vmware.com/labmanager">
|
202
|
+
# <ConfigurationCloneResult>1150</ConfigurationCloneResult>
|
203
|
+
# </ConfigurationCloneResponse>
|
204
|
+
#
|
205
|
+
# * configuration_name to clone
|
206
|
+
# * new_configuration_name to clone to
|
207
|
+
#
|
208
|
+
# returns the id of the cloned configuration.
|
209
|
+
#
|
210
|
+
def clone(configuration_name, new_configuration_name)
|
211
|
+
config = configuration(configuration_name)
|
212
|
+
|
213
|
+
data = proxy.ConfigurationClone(
|
214
|
+
:configurationId => config.id,
|
215
|
+
:newWorkspaceName => new_configuration_name)
|
216
|
+
data["ConfigurationCloneResult"]
|
217
|
+
end
|
218
|
+
|
219
|
+
# Undeploys a configuration
|
220
|
+
#
|
221
|
+
# ==== XML Sample
|
222
|
+
#
|
223
|
+
# * configuration_name to undeploy
|
224
|
+
#
|
225
|
+
def undeploy(configuration_name)
|
226
|
+
config = configuration(configuration_name)
|
227
|
+
|
228
|
+
proxy.ConfigurationUndeploy(:configurationId => config.id)
|
229
|
+
end
|
230
|
+
|
231
|
+
# Delete a configuration
|
232
|
+
#
|
233
|
+
# ==== XML Sample
|
234
|
+
#
|
235
|
+
# <ConfigurationDelete xmlns="http://vmware.com/labmanager">
|
236
|
+
# <configurationId>int</configurationId>
|
237
|
+
# </ConfigurationDelete>
|
238
|
+
#
|
239
|
+
# <ConfigurationDeleteResponse xmlns="http://vmware.com/labmanager" />
|
240
|
+
#
|
241
|
+
# * configuration_name to be deleted
|
242
|
+
#
|
243
|
+
# raises SOAP:FaultError. See e.faultstring or e.detail
|
244
|
+
#
|
245
|
+
def delete(configuration_name, options = {})
|
246
|
+
config = configuration(configuration_name)
|
247
|
+
|
248
|
+
if (config.deployed)
|
249
|
+
fault = OpenStruct.new(
|
250
|
+
:faultstring => "Can not delete configuration that is deployed",
|
251
|
+
:detail => "Must use force flag to auto-undeploy.")
|
252
|
+
raise SOAP::FaultError.new(fault) unless options[:force]
|
253
|
+
|
254
|
+
proxy.ConfigurationUndeploy(:configurationId => config.id)
|
255
|
+
end
|
256
|
+
|
257
|
+
proxy.ConfigurationDelete(:configurationId => config.id)
|
258
|
+
end
|
259
|
+
|
142
260
|
private
|
261
|
+
def self.config
|
262
|
+
YAML::load_file(@@configPath)
|
263
|
+
end
|
264
|
+
|
143
265
|
def proxy
|
144
266
|
factory = SOAP::WSDLDriverFactory.new("#{@@url}?WSDL")
|
145
267
|
proxy = factory.create_rpc_driver
|
@@ -147,6 +269,9 @@ class LabManager
|
|
147
269
|
proxy.generate_explicit_type = false # No datatype with request
|
148
270
|
proxy.headerhandler << LabManagerHeader.new(@organization, @workspace, @@username, @@password)
|
149
271
|
|
272
|
+
# The lab manager clone and checkout requests can take a long time.
|
273
|
+
proxy.streamhandler.client.receive_timeout = 15 * 60 # seconds
|
274
|
+
|
150
275
|
#proxy.streamhandler.client.ssl_config.verify_mode = false
|
151
276
|
|
152
277
|
proxy
|
@@ -154,10 +279,10 @@ class LabManager
|
|
154
279
|
|
155
280
|
def load_config(url, username, password)
|
156
281
|
if File.exists? @@configPath
|
157
|
-
|
158
|
-
@@url =
|
159
|
-
@@username =
|
160
|
-
@@password =
|
282
|
+
configData = LabManager.config
|
283
|
+
@@url = configData["url"]
|
284
|
+
@@username = configData["username"]
|
285
|
+
@@password = configData["password"]
|
161
286
|
end
|
162
287
|
|
163
288
|
@@url = url if !url.nil?
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class Configuration
|
2
|
+
|
3
|
+
def self.parse(data)
|
4
|
+
|
5
|
+
if !data.keys.empty? && data.keys.first != "Configuration"
|
6
|
+
data = data.values[0]
|
7
|
+
end
|
8
|
+
|
9
|
+
configuration = Configuration.new
|
10
|
+
data_config = data["Configuration"]
|
11
|
+
if data_config
|
12
|
+
configuration.id = data_config["id"]
|
13
|
+
configuration.name = data_config["name"]
|
14
|
+
configuration.deployed = data_config["isDeployed"] == "true" ? true : false
|
15
|
+
end
|
16
|
+
|
17
|
+
configuration
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_accessor :id
|
21
|
+
attr_accessor :name
|
22
|
+
attr_accessor :deployed
|
23
|
+
end
|
metadata
CHANGED
@@ -1,97 +1,84 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: lab-manager
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.8
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
- 7
|
10
|
-
version: 1.0.7
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Ed Sumerfield
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-11-05 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: mumboe-soap4r
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
33
22
|
type: :runtime
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: rspec
|
37
23
|
prerelease: false
|
38
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
39
33
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
version: "0"
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
47
38
|
type: :development
|
48
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
49
46
|
description: Access information about your Lab Manager configurations.
|
50
47
|
email: esumerfield@ipcoop.com
|
51
48
|
executables: []
|
52
|
-
|
53
49
|
extensions: []
|
54
|
-
|
55
50
|
extra_rdoc_files: []
|
56
|
-
|
57
|
-
|
51
|
+
files:
|
52
|
+
- lib/lab_manager/configuration.rb
|
58
53
|
- lib/lab_manager/httpclient_patch.rb
|
59
54
|
- lib/lab_manager/machine.rb
|
60
55
|
- lib/lab_manager.rb
|
56
|
+
- bin/lab_checkout.sh
|
57
|
+
- bin/lab_clone.sh
|
58
|
+
- bin/lab_delete.sh
|
61
59
|
- bin/lab_machines.sh
|
62
|
-
has_rdoc: true
|
63
60
|
homepage:
|
64
61
|
licenses: []
|
65
|
-
|
66
62
|
post_install_message:
|
67
63
|
rdoc_options: []
|
68
|
-
|
69
|
-
require_paths:
|
64
|
+
require_paths:
|
70
65
|
- lib
|
71
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
67
|
none: false
|
73
|
-
requirements:
|
74
|
-
- -
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
|
77
|
-
|
78
|
-
- 0
|
79
|
-
version: "0"
|
80
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
73
|
none: false
|
82
|
-
requirements:
|
83
|
-
- -
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
|
86
|
-
segments:
|
87
|
-
- 0
|
88
|
-
version: "0"
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
89
78
|
requirements: []
|
90
|
-
|
91
79
|
rubyforge_project:
|
92
|
-
rubygems_version: 1.
|
80
|
+
rubygems_version: 1.8.23
|
93
81
|
signing_key:
|
94
82
|
specification_version: 3
|
95
83
|
summary: Client for VMWare Lab Manager
|
96
84
|
test_files: []
|
97
|
-
|