vcautils 0.7
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.
- checksums.yaml +15 -0
- data/bin/compute +3 -0
- data/bin/vca +3 -0
- data/bin/vchs +3 -0
- data/lib/compute.rb +403 -0
- data/lib/modules/compute-be.rb +108 -0
- data/lib/modules/vca-be.rb +215 -0
- data/lib/modules/vchs-be.rb +63 -0
- data/lib/vca.rb +514 -0
- data/lib/vchs.rb +298 -0
- metadata +177 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MDBhZDI5Y2FjYzczNWM4MDQxNzM1NzYyNTdkMzU4MzI1OWIwYmU3Mw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NThkYjYzZmJjYjU3ZDNlOTY4NGViNjk0YzE2ZmY5MDEwYzNjNWNlYg==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MjUzY2IzYzc3ODhhOTlmNTgzYmYwY2JmMTVhMzJmYzBlNTI3NTBmOGE0OTNk
|
10
|
+
NjdhYjQwMjgxNjgzMjQ3NDBlYTE0MzkwOWQzNWI2YWVlOWJiYTM3YjMwYzkx
|
11
|
+
NTliODNkMzkzMDc2MjAxZjA1NGZkNmYxMmIwMzYwOTQ0ZGJkYzc=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
Y2RjYzVhMjkyM2M0OWEzOTAyOTJkOWYyMDVhNTJjNTQ5ZTQ1NmFhYzQ5MGNi
|
14
|
+
OGY5N2FkYzQ3YzRhZDNlYjI0MzVjMTllYjcxYmE4OWY2MTViYmZlYTkzMWI5
|
15
|
+
NmUxMDFmZjhlYWExMWFjMjY3YWQ5YjMxNWFkZjI0YzJkNGE0N2Y=
|
data/bin/compute
ADDED
data/bin/vca
ADDED
data/bin/vchs
ADDED
data/lib/compute.rb
ADDED
@@ -0,0 +1,403 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
#################################################################################
|
4
|
+
#### Massimo Re Ferre' ####
|
5
|
+
#### www.it20.info ####
|
6
|
+
#### vcautils, a set of utilities for vCloud Air Consumers ####
|
7
|
+
#################################################################################
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
#################################################################################
|
13
|
+
#### vcacompute.rb is the front end program that presents a CLI interface ####
|
14
|
+
#### It leverages the vcautils library ####
|
15
|
+
#################################################################################
|
16
|
+
|
17
|
+
|
18
|
+
#################################################################################
|
19
|
+
#### IMPORTANT !! ####
|
20
|
+
#### The program reads a file called vcautils.yml in the working directory ####
|
21
|
+
#### If the file does not exist the program will abort ####
|
22
|
+
#### The file is used to provide the program with connectivity parameters ####
|
23
|
+
#################################################################################
|
24
|
+
|
25
|
+
# This is the format of the vcautils.yml file:
|
26
|
+
# :username: email@domain
|
27
|
+
# :password: password
|
28
|
+
# :serviceroot: https://vca.vmware.com
|
29
|
+
# :mode: admin | developer
|
30
|
+
|
31
|
+
# These are the additional modules/gems required to run the program
|
32
|
+
|
33
|
+
require 'httparty'
|
34
|
+
require 'yaml'
|
35
|
+
require 'xml-fu'
|
36
|
+
require 'pp'
|
37
|
+
require 'json'
|
38
|
+
require 'awesome_print' #optional - useful for debugging
|
39
|
+
|
40
|
+
require 'modules/compute-be'
|
41
|
+
|
42
|
+
|
43
|
+
# We stole this piece of code (silence_warnings) from the Internet.
|
44
|
+
# We are using it to silence the warnings of the certificates settings (below)
|
45
|
+
|
46
|
+
|
47
|
+
def silence_warnings(&block)
|
48
|
+
warn_level = $VERBOSE
|
49
|
+
$VERBOSE = nil
|
50
|
+
result = block.call
|
51
|
+
$VERBOSE = warn_level
|
52
|
+
result
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
#=begin
|
60
|
+
class String
|
61
|
+
def black; "\033[30m#{self}\033[0m" end
|
62
|
+
def red; "\033[31m#{self}\033[0m" end
|
63
|
+
def green; "\033[32m#{self}\033[0m" end
|
64
|
+
def brown; "\033[33m#{self}\033[0m" end
|
65
|
+
def blue; "\033[34m#{self}\033[0m" end
|
66
|
+
def magenta; "\033[35m#{self}\033[0m" end
|
67
|
+
def cyan; "\033[36m#{self}\033[0m" end
|
68
|
+
def gray; "\033[37m#{self}\033[0m" end
|
69
|
+
def bg_black; "\033[40m#{self}\033[0m" end
|
70
|
+
def bg_red; "\033[41m#{self}\033[0m" end
|
71
|
+
def bg_green; "\033[42m#{self}\033[0m" end
|
72
|
+
def bg_brown; "\033[43m#{self}\033[0m" end
|
73
|
+
def bg_blue; "\033[44m#{self}\033[0m" end
|
74
|
+
def bg_magenta; "\033[45m#{self}\033[0m" end
|
75
|
+
def bg_cyan; "\033[46m#{self}\033[0m" end
|
76
|
+
def bg_gray; "\033[47m#{self}\033[0m" end
|
77
|
+
def bold; "\033[1m#{self}\033[22m" end
|
78
|
+
def reverse_color; "\033[7m#{self}\033[27m" end
|
79
|
+
end #String
|
80
|
+
#=end
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
# This bypass certification checks... NOT a great idea for production but ok for test / dev
|
87
|
+
|
88
|
+
silence_warnings do
|
89
|
+
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
# This is what the program accepts as input
|
94
|
+
|
95
|
+
def usage
|
96
|
+
puts "\te.g. compute ".green + "<API-URL-endpoint> <Org name>".magenta + " computetoken".green
|
97
|
+
puts "\te.g. compute ".green + "<API-URL-endpoint> <Org name>".magenta + " catalogs".green
|
98
|
+
puts "\te.g. compute ".green + "<API-URL-endpoint> <Org name>".magenta + " catalog".green + " <catalog id>".magenta
|
99
|
+
puts "\te.g. compute ".green + "<API-URL-endpoint> <Org name>".magenta + " orgvms".green
|
100
|
+
puts "\te.g. compute ".green + "<API-URL-endpoint> <Org name>".magenta + " orgvapps".green
|
101
|
+
puts "\te.g. compute ".green + "<API-URL-endpoint> <Org name>".magenta + " vdcs".green
|
102
|
+
puts "\te.g. compute ".green + "<API-URL-endpoint> <Org name>".magenta + " vdc".green + " <vdc id>".magenta
|
103
|
+
puts "\te.g. compute ".green + "<API-URL-endpoint> <Org name>".magenta + " vdc".green + " <vdc id>".magenta + " vapps".green
|
104
|
+
puts "\te.g. compute ".green + "<API-URL-endpoint> <Org name>".magenta + " vdc".green + " <vdc id>".magenta + " networks".green
|
105
|
+
puts "\n"
|
106
|
+
|
107
|
+
end #usage
|
108
|
+
|
109
|
+
|
110
|
+
# These are the variables the program accept as inputs (see the usage section for more info)
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
$input0 = ARGV[0]
|
115
|
+
|
116
|
+
$input1 = ARGV[1]
|
117
|
+
|
118
|
+
$input2 = ARGV[2]
|
119
|
+
|
120
|
+
$input3 = ARGV[3]
|
121
|
+
|
122
|
+
$input4 = ARGV[4]
|
123
|
+
|
124
|
+
|
125
|
+
# The if checks if the user called an operation. If not the case, we print the text on how to use the CLI
|
126
|
+
|
127
|
+
|
128
|
+
if $input0 && $input1 && $input2
|
129
|
+
|
130
|
+
# We login (the login method is in vcautilscore)
|
131
|
+
|
132
|
+
file_path = "vcautils.yml"
|
133
|
+
raise "no file #{file_path}" unless File.exists? file_path
|
134
|
+
configuration = YAML.load_file(file_path)
|
135
|
+
username = configuration[:username]
|
136
|
+
password = configuration[:password]
|
137
|
+
mode = configuration[:mode]
|
138
|
+
computeapiendpoint = $input0
|
139
|
+
orgname = $input1
|
140
|
+
puts
|
141
|
+
puts "Logging in ...\n\n"
|
142
|
+
|
143
|
+
|
144
|
+
compute = Compute.new()
|
145
|
+
|
146
|
+
tempapiversionsarray = compute.apiversions(computeapiendpoint)
|
147
|
+
if mode == "developer" then puts JSON.pretty_generate(tempapiversionsarray) end
|
148
|
+
apiversionsarray = Array.new
|
149
|
+
tempapiversionsarray['SupportedVersions']['VersionInfo'].length.times do |i|
|
150
|
+
apiversionsarray.push(tempapiversionsarray['SupportedVersions']['VersionInfo'][i]['Version'])
|
151
|
+
end
|
152
|
+
apiversionsarray = apiversionsarray.sort_by do |x|
|
153
|
+
x.split(".").map {|i| i.to_i}
|
154
|
+
end
|
155
|
+
|
156
|
+
apiversion = apiversionsarray.last
|
157
|
+
|
158
|
+
computetoken = compute.login(username, password, orgname, computeapiendpoint, apiversion)
|
159
|
+
|
160
|
+
if mode == "developer" then
|
161
|
+
puts
|
162
|
+
puts "computetoken: " + computetoken
|
163
|
+
puts "apiversion: " + apiversion
|
164
|
+
end
|
165
|
+
|
166
|
+
case $input2.chomp
|
167
|
+
when 'computetoken'
|
168
|
+
puts "To start consuming this instance right away use the following parameters: ".green
|
169
|
+
puts " - login url : ".green + "GET ".blue + computeapiendpoint.blue
|
170
|
+
puts " - x-vcloud-authorization : ".green + computetoken.blue
|
171
|
+
puts " - Accept : ".green + "application/*+xml;version=".blue + apiversion.blue
|
172
|
+
puts
|
173
|
+
puts " - Available APIs : ".green + apiversionsarray.to_s.blue
|
174
|
+
puts
|
175
|
+
|
176
|
+
when 'vdcs'
|
177
|
+
vdcsarray = compute.vdcs(computetoken, computeapiendpoint, apiversion)
|
178
|
+
if mode == "developer" then puts JSON.pretty_generate(vdcsarray) end
|
179
|
+
vdcsarray["QueryResultRecords"]["OrgVdcRecord"].length.times do |e|
|
180
|
+
puts "name : ".green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["name"].blue
|
181
|
+
puts "status : ".green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["status"].blue
|
182
|
+
puts "href : ".green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["href"].blue
|
183
|
+
puts "orgName : ".green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["orgName"].blue
|
184
|
+
puts
|
185
|
+
end
|
186
|
+
|
187
|
+
when 'orgvapps'
|
188
|
+
orgvappsarray = compute.orgvapps(computetoken, computeapiendpoint, apiversion)
|
189
|
+
if mode == "developer" then puts JSON.pretty_generate(orgvappsarray) end
|
190
|
+
if orgvappsarray["QueryResultRecords"]["VAppRecord"] == nil
|
191
|
+
puts "The are no vApps in this instance".red
|
192
|
+
puts
|
193
|
+
else
|
194
|
+
orgvappsarray["QueryResultRecords"]["VAppRecord"].length.times do |e|
|
195
|
+
puts "name : ".green + orgvappsarray["QueryResultRecords"]["VAppRecord"][e]["name"].blue
|
196
|
+
puts "href : ".green + orgvappsarray["QueryResultRecords"]["VAppRecord"][e]["href"].blue
|
197
|
+
puts "numberOfVMs : ".green + orgvappsarray["QueryResultRecords"]["VAppRecord"][e]["numberOfVMs"].blue
|
198
|
+
puts "vdcName : ".green + orgvappsarray["QueryResultRecords"]["VAppRecord"][e]["vdcName"].blue
|
199
|
+
puts
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
when 'orgvms'
|
204
|
+
orgvmsarray = compute.orgvms(computetoken, computeapiendpoint, apiversion)
|
205
|
+
if mode == "developer" then puts JSON.pretty_generate(orgvmsarray) end
|
206
|
+
if orgvmsarray["QueryResultRecords"]["VMRecord"] == nil
|
207
|
+
puts "The are no vApps in this instance".red
|
208
|
+
puts
|
209
|
+
else
|
210
|
+
puts
|
211
|
+
orgvmsarray["QueryResultRecords"]["VMRecord"].length.times do |e|
|
212
|
+
puts "name : ".green + orgvmsarray["QueryResultRecords"]["VMRecord"][e]["name"].blue
|
213
|
+
puts "isVAppTemplate : ".green + orgvmsarray["QueryResultRecords"]["VMRecord"][e]["isVAppTemplate"].blue
|
214
|
+
puts "containerName : ".green + orgvmsarray["QueryResultRecords"]["VMRecord"][e]["containerName"].blue
|
215
|
+
puts
|
216
|
+
end
|
217
|
+
puts "Please be aware that this list also contains all VM templates in all catalogs. See attribute <isVAppTemplate>.".magenta
|
218
|
+
puts
|
219
|
+
end
|
220
|
+
|
221
|
+
when 'catalogs'
|
222
|
+
catalogsarray = compute.catalogs(computetoken, computeapiendpoint, apiversion)
|
223
|
+
if mode == "developer" then puts JSON.pretty_generate(catalogsarray) end
|
224
|
+
catalogsarray["QueryResultRecords"]["CatalogRecord"].length.times do |e|
|
225
|
+
puts "name : ".green + catalogsarray["QueryResultRecords"]["CatalogRecord"][e]["name"].blue
|
226
|
+
puts "isPublished : ".green + catalogsarray["QueryResultRecords"]["CatalogRecord"][e]["isPublished"].blue
|
227
|
+
puts "isShared : ".green + catalogsarray["QueryResultRecords"]["CatalogRecord"][e]["isShared"].blue
|
228
|
+
puts "numberOfMedia : ".green + catalogsarray["QueryResultRecords"]["CatalogRecord"][e]["numberOfMedia"].blue
|
229
|
+
puts "numberOfVAppTemplates : ".green + catalogsarray["QueryResultRecords"]["CatalogRecord"][e]["numberOfVAppTemplates"].blue
|
230
|
+
puts "href : ".green + catalogsarray["QueryResultRecords"]["CatalogRecord"][e]["href"].blue
|
231
|
+
puts
|
232
|
+
end # catalogsarray["QueryResultRecords"]["CatalogRecord"].length.times
|
233
|
+
|
234
|
+
when 'catalog'
|
235
|
+
if $input3 != nil
|
236
|
+
catalogsarray = compute.catalogs(computetoken, computeapiendpoint, apiversion)
|
237
|
+
catalogexists = false
|
238
|
+
catalogsarray["QueryResultRecords"]["CatalogRecord"].length.times do |e|
|
239
|
+
if catalogsarray["QueryResultRecords"]["CatalogRecord"][e]["name"] == $input3
|
240
|
+
catalogitemsarray = compute.catalogitems(computetoken, catalogsarray["QueryResultRecords"]["CatalogRecord"][e]["href"], apiversion)
|
241
|
+
if mode == "developer" then puts JSON.pretty_generate(catalogitemsarray) end
|
242
|
+
if catalogitemsarray["Catalog"]["CatalogItems"] == nil
|
243
|
+
puts "The catalog ".red + $input3.blue + " is empty".red
|
244
|
+
puts
|
245
|
+
else
|
246
|
+
catalogitemsarray["Catalog"]["CatalogItems"]["CatalogItem"].length.times do |x|
|
247
|
+
puts "CatalogItem name : ".green + catalogitemsarray["Catalog"]["CatalogItems"]["CatalogItem"][x]["name"].blue
|
248
|
+
puts "CatalogItem id : ".green + catalogitemsarray["Catalog"]["CatalogItems"]["CatalogItem"][x]["id"].blue
|
249
|
+
catalogitemdetails = compute.instancedetails(computetoken, "",catalogitemsarray["Catalog"]["CatalogItems"]["CatalogItem"][x]["href"], apiversion)
|
250
|
+
#puts JSON.pretty_generate(catalogitemdetails)
|
251
|
+
puts " - Entity name : ".green + catalogitemdetails["CatalogItem"]["Entity"]["name"].blue
|
252
|
+
puts " - Entity href : ".green + catalogitemdetails["CatalogItem"]["Entity"]["href"].blue
|
253
|
+
puts
|
254
|
+
end #catalogitemsarray["Catalog"]["CatalogItems"]["CatalogItem"].length.times do |x|
|
255
|
+
end #if catalogitemsarray["Catalog"]["CatalogItems"] == "null"
|
256
|
+
catalogexists = true
|
257
|
+
end #if catalogsarray["QueryResultRecords"]["CatalogRecord"][e] == $input3
|
258
|
+
end #catalogsarray["QueryResultRecords"]["CatalogRecord"].length.times
|
259
|
+
if catalogexists == false
|
260
|
+
puts "The catalog ".red + $input3.blue + " does not exist".red
|
261
|
+
puts
|
262
|
+
end #if catalogexists == false
|
263
|
+
else #if $input3 != nil
|
264
|
+
puts "please provide a catalog name to query".red
|
265
|
+
puts
|
266
|
+
end #if $input3 != nil
|
267
|
+
|
268
|
+
|
269
|
+
|
270
|
+
|
271
|
+
when 'vdc'
|
272
|
+
if $input3 != nil
|
273
|
+
vdcsarray = compute.vdcs(computetoken, computeapiendpoint, apiversion)
|
274
|
+
if mode == "developer" then puts JSON.pretty_generate(vdcsarray) end
|
275
|
+
vdcexists = false
|
276
|
+
vdcsarray["QueryResultRecords"]["OrgVdcRecord"].length.times do |e|
|
277
|
+
if vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["name"] == $input3
|
278
|
+
if $input4 == nil
|
279
|
+
#puts JSON.pretty_generate(vdcsarray)
|
280
|
+
puts "status : ".bold.green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["status"].bold.blue
|
281
|
+
puts "numberOfVApps : ".bold.green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["numberOfVApps"].bold.blue
|
282
|
+
puts "cpuLimitMhz : ".green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["cpuLimitMhz"].blue
|
283
|
+
puts "cpuUsedMhz : ".green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["cpuUsedMhz"].blue
|
284
|
+
puts "memoryLimitMB : ".green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["memoryLimitMB"].blue
|
285
|
+
puts "memoryUsedMB : ".green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["memoryUsedMB"].blue
|
286
|
+
puts "storageLimitMB : ".green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["storageLimitMB"].blue
|
287
|
+
puts "storageUsedMB : ".green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["storageUsedMB"].blue
|
288
|
+
puts "pvdcHardwareVersion : ".green + vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["pvdcHardwareVersion"].blue
|
289
|
+
puts
|
290
|
+
else #if $input4 == nil
|
291
|
+
case $input4.chomp
|
292
|
+
when 'networks'
|
293
|
+
networksarray = compute.networks(computetoken, vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["href"], apiversion)
|
294
|
+
if mode == "developer" then puts JSON.pretty_generate(networksarray) end
|
295
|
+
networksarray["Network"].length.times do |x|
|
296
|
+
networkdetails = compute.networkdetails(computetoken, networksarray["Network"][x]["href"], apiversion)
|
297
|
+
if mode == "developer" then puts JSON.pretty_generate(networkdetails) end
|
298
|
+
puts "name : ".green + networkdetails["OrgVdcNetwork"]["name"].blue
|
299
|
+
puts "href : ".green + networkdetails["OrgVdcNetwork"]["href"].blue
|
300
|
+
puts "Configuration : ".green
|
301
|
+
puts " - IpScopes : ".green
|
302
|
+
puts " - IpScope : ".green
|
303
|
+
puts " - Gateway : ".green + networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["Gateway"].blue
|
304
|
+
puts " - Netmask : ".green + networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["Netmask"].blue
|
305
|
+
puts " - IsEnabled : ".green + networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["IsEnabled"].blue
|
306
|
+
puts " - IpRanges : ".green
|
307
|
+
puts " - IpRange : ".green
|
308
|
+
if networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["IpRanges"]
|
309
|
+
networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["IpRanges"]["IpRange"].length.times do |y|
|
310
|
+
puts " - StartAddress : ".green + networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["IpRanges"]["IpRange"][y]["StartAddress"].blue
|
311
|
+
puts " - EndAddress : ".green + networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["IpRanges"]["IpRange"][y]["EndAddress"].blue
|
312
|
+
end #networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["IpRanges"]["IpRange"].length do |y|
|
313
|
+
end #if networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["IpRanges"]
|
314
|
+
puts " - FenceMode : ".green + networkdetails["OrgVdcNetwork"]["Configuration"]["FenceMode"].blue
|
315
|
+
puts " - RetainNetInfoAcrossDeployments : ".green + networkdetails["OrgVdcNetwork"]["Configuration"]["RetainNetInfoAcrossDeployments"].blue
|
316
|
+
puts "IsShared : ".green + networkdetails["OrgVdcNetwork"]["IsShared"].blue
|
317
|
+
puts
|
318
|
+
puts
|
319
|
+
end # networksarray["Network"].length.times do |x|
|
320
|
+
|
321
|
+
else #case $input4.chomp
|
322
|
+
puts "The operation ".red + $input4.blue + " against the vdc is not recognized as a valid operation".red
|
323
|
+
end #case $input4.chomp
|
324
|
+
end #if $input4 == nil
|
325
|
+
vdcexists = true
|
326
|
+
end #if vdcsarray["QueryResultRecords"]["OrgVdcRecord"][e]["name"] == $input3
|
327
|
+
end #vdcsarray["QueryResultRecords"]["OrgVdcRecord"].length.times do |e|
|
328
|
+
|
329
|
+
if vdcexists == false
|
330
|
+
puts "The vdc ".red + $input3.blue + " does not exist".red
|
331
|
+
puts
|
332
|
+
end #if vdcexists == false
|
333
|
+
|
334
|
+
else #if $input3 != nil
|
335
|
+
puts "please provide a vdc name to query".red
|
336
|
+
puts
|
337
|
+
end #if $input3 != nil
|
338
|
+
|
339
|
+
|
340
|
+
else #case $input2.chomp
|
341
|
+
puts "The operation ".red + $input3.to_s + " against the instance is not recognized as a valid operation".red
|
342
|
+
puts
|
343
|
+
end #case $input2.chomp
|
344
|
+
|
345
|
+
|
346
|
+
|
347
|
+
|
348
|
+
# If the user did not specify an operation at all we suggest how to properly use the CLI
|
349
|
+
|
350
|
+
else #if $input0 && $input1 && input2
|
351
|
+
puts "\n"
|
352
|
+
puts "You must specify the <API-URL-endpoint>, the <Org name> and a valid operation".red
|
353
|
+
puts "e.g. https://us-virginia-1-4.vchs.vmware.com 616ge553-342d-e4-be4a-d50e5sde5283 vdcs".red
|
354
|
+
puts "e.g. https://iaas.vcdcloud.com acme catalogs".red
|
355
|
+
puts "\n"
|
356
|
+
usage()
|
357
|
+
puts "\n"
|
358
|
+
|
359
|
+
|
360
|
+
|
361
|
+
end #if $input0 && $input1 && input2
|
362
|
+
|
363
|
+
|
364
|
+
|
365
|
+
|
366
|
+
|
367
|
+
|
368
|
+
|
369
|
+
|
370
|
+
|
371
|
+
|
372
|
+
|
373
|
+
|
374
|
+
|
375
|
+
|
376
|
+
|
377
|
+
|
378
|
+
|
379
|
+
|
380
|
+
|
381
|
+
|
382
|
+
|
383
|
+
|
384
|
+
|
385
|
+
|
386
|
+
|
387
|
+
|
388
|
+
|
389
|
+
|
390
|
+
|
391
|
+
|
392
|
+
|
393
|
+
|
394
|
+
|
395
|
+
|
396
|
+
|
397
|
+
|
398
|
+
|
399
|
+
|
400
|
+
|
401
|
+
|
402
|
+
|
403
|
+
|
@@ -0,0 +1,108 @@
|
|
1
|
+
#################################################################################
|
2
|
+
#### Massimo Re Ferre' ####
|
3
|
+
#### www.it20.info ####
|
4
|
+
#### vcautils, a set of utilities for vCloud Air Consumers ####
|
5
|
+
#################################################################################
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
class Compute
|
10
|
+
include HTTParty
|
11
|
+
format :xml
|
12
|
+
#debug_output $stderr
|
13
|
+
|
14
|
+
|
15
|
+
def hashtoarray(structure)
|
16
|
+
#this function work arounds an issue of httparty (and other REST clients apparently) that do not comply to the XML Schema correctly
|
17
|
+
#in some circumstances the httparty response contains a hash whereas it should be an array of hash with one item
|
18
|
+
#this function takes input a JSON structure and check if it's a hash. If it is, it will turn it into an array of hash with one element
|
19
|
+
#if the input is already an Array of hash it will do nothing
|
20
|
+
#for further reference: http://stackoverflow.com/questions/28282125/httparty-response-interpretation-in-ruby/
|
21
|
+
structure = [structure] unless structure.is_a? Array
|
22
|
+
return structure
|
23
|
+
end #hashtoarray
|
24
|
+
|
25
|
+
|
26
|
+
def apiversions(apiendpoint)
|
27
|
+
self.class.base_uri apiendpoint
|
28
|
+
apiversionsarray = self.class.get('/api/versions')
|
29
|
+
return apiversionsarray
|
30
|
+
end #setapiversion
|
31
|
+
|
32
|
+
|
33
|
+
def login(username, password, orgname, computeapiendpoint, apiversion)
|
34
|
+
credentials = username + "@" + orgname
|
35
|
+
self.class.base_uri computeapiendpoint
|
36
|
+
self.class.basic_auth credentials, password
|
37
|
+
self.class.default_options[:headers] = {"Accept" => "application/*+xml;version=" + apiversion}
|
38
|
+
response = self.class.post('/api/sessions')
|
39
|
+
computetoken = response.headers['x-vcloud-authorization']
|
40
|
+
return computetoken
|
41
|
+
end #login
|
42
|
+
|
43
|
+
|
44
|
+
def instancedetails(computetoken, computeapiendpoint, query, apiversion)
|
45
|
+
self.class.default_options[:headers] = { "Accept" => "application/*+xml;version=" + apiversion, "x-vcloud-authorization" => computetoken }
|
46
|
+
instancedetails = self.class.get(computeapiendpoint + query)
|
47
|
+
return instancedetails
|
48
|
+
end #login
|
49
|
+
|
50
|
+
|
51
|
+
def vdcs (computetoken, computeapiendpoint, apiversion)
|
52
|
+
vdcsarray = instancedetails(computetoken, computeapiendpoint, "/api/admin/vdcs/query", apiversion)
|
53
|
+
vdcsarray["QueryResultRecords"]["OrgVdcRecord"] = hashtoarray(vdcsarray["QueryResultRecords"]["OrgVdcRecord"])
|
54
|
+
return vdcsarray
|
55
|
+
end #vdcs
|
56
|
+
|
57
|
+
|
58
|
+
def catalogs (computetoken, computeapiendpoint, apiversion)
|
59
|
+
catalogsarray = instancedetails(computetoken, computeapiendpoint, "/api/catalogs/query", apiversion)
|
60
|
+
catalogsarray["QueryResultRecords"]["CatalogRecord"] = hashtoarray(catalogsarray["QueryResultRecords"]["CatalogRecord"])
|
61
|
+
return catalogsarray
|
62
|
+
end #catalogs
|
63
|
+
|
64
|
+
|
65
|
+
def catalogitems (computetoken, cataloghref, apiversion)
|
66
|
+
catalogitemsarray = instancedetails(computetoken, cataloghref, "", apiversion)
|
67
|
+
if catalogitemsarray["Catalog"]["CatalogItems"] != nil
|
68
|
+
catalogitemsarray["Catalog"]["CatalogItems"]["CatalogItem"] = hashtoarray(catalogitemsarray["Catalog"]["CatalogItems"]["CatalogItem"])
|
69
|
+
end
|
70
|
+
return catalogitemsarray
|
71
|
+
end #catalogitems
|
72
|
+
|
73
|
+
|
74
|
+
def orgvms (computetoken, computeapiendpoint, apiversion)
|
75
|
+
orgvmsarray = instancedetails(computetoken, computeapiendpoint, "/api/vms/query", apiversion)
|
76
|
+
return orgvmsarray
|
77
|
+
end #orgvms
|
78
|
+
|
79
|
+
|
80
|
+
def orgvapps (computetoken, computeapiendpoint, apiversion)
|
81
|
+
orgvappsarray = instancedetails(computetoken, computeapiendpoint, "/api/vApps/query", apiversion)
|
82
|
+
return orgvappsarray
|
83
|
+
end #orgvapps
|
84
|
+
|
85
|
+
|
86
|
+
def networks (computetoken, vdchref, apiversion)
|
87
|
+
vdcdetails = instancedetails(computetoken, vdchref, "", apiversion)
|
88
|
+
networksarray = vdcdetails["Vdc"]["AvailableNetworks"]
|
89
|
+
networksarray["Network"] = hashtoarray(networksarray["Network"])
|
90
|
+
return networksarray
|
91
|
+
end #networks
|
92
|
+
|
93
|
+
|
94
|
+
def networkdetails (computetoken, networkhref, apiversion)
|
95
|
+
networkdetails = instancedetails(computetoken, networkhref, "", apiversion)
|
96
|
+
if networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["IpRanges"]
|
97
|
+
networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["IpRanges"]["IpRange"] = hashtoarray(networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["IpRanges"]["IpRange"])
|
98
|
+
end #if networkdetails["OrgVdcNetwork"]["Configuration"]["IpScopes"]["IpScope"]["IpRanges"]
|
99
|
+
return networkdetails
|
100
|
+
end #networkdetails
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
end #Compute
|
107
|
+
|
108
|
+
|