vcautils 0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,215 @@
|
|
1
|
+
#################################################################################
|
2
|
+
#### Massimo Re Ferre' ####
|
3
|
+
#### www.it20.info ####
|
4
|
+
#### vcautils, a set of utilities for vCloud Air Consumers ####
|
5
|
+
#################################################################################
|
6
|
+
|
7
|
+
|
8
|
+
class Iam
|
9
|
+
include HTTParty
|
10
|
+
format :xml
|
11
|
+
#debug_output $stderr
|
12
|
+
|
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
|
+
|
27
|
+
def login(username, password, serviceroot)
|
28
|
+
self.class.base_uri serviceroot
|
29
|
+
#Avoid setting the basic_auth as (due to an httparty problem) it propagates and gets retained for other calls inside the class
|
30
|
+
#self.class.basic_auth username, password
|
31
|
+
auth_token = Base64.encode64(username + ":" + password)
|
32
|
+
self.class.default_options[:headers] = {"Accept" => "application/xml;version=5.7", "Authorization" => "Basic " + auth_token}
|
33
|
+
response = self.class.post('/api/iam/login')
|
34
|
+
token = response.headers['vchs-authorization']
|
35
|
+
return token
|
36
|
+
end #login
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
def users(token, serviceroot)
|
41
|
+
self.class.base_uri serviceroot
|
42
|
+
#legacy type
|
43
|
+
#self.class.default_options[:headers] = { "Accept" => "application/xml;class=com.vmware.vchs.iam.api.schema.v2.classes.user.Users;version=5.7", "Authorization" => "Bearer " + token }
|
44
|
+
self.class.default_options[:headers] = { "Accept" => "application/xml;version=*", "Authorization" => "Bearer " + token }
|
45
|
+
usersarray = self.class.get('/api/iam/Users')
|
46
|
+
usersarray['Users']['User'] = hashtoarray(usersarray['Users']['User'])
|
47
|
+
usersarray['Users']['User'].length.times do |e|
|
48
|
+
usersarray['Users']['User'][e]["roles"]["role"] = hashtoarray(usersarray['Users']['User'][e]["roles"]["role"])
|
49
|
+
end
|
50
|
+
return usersarray
|
51
|
+
end #users
|
52
|
+
|
53
|
+
|
54
|
+
def logout
|
55
|
+
self.class.delete('/api/session')
|
56
|
+
end
|
57
|
+
|
58
|
+
def links
|
59
|
+
response = self.class.get('/api/session')
|
60
|
+
response['Session']['Link'].each do |link|
|
61
|
+
puts link['href']
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
end #Iam
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
class Sc
|
72
|
+
include HTTParty
|
73
|
+
format :xml
|
74
|
+
#debug_output $stderr
|
75
|
+
|
76
|
+
def hashtoarray(structure)
|
77
|
+
#this function work arounds an issue of httparty (and other REST clients apparently) that do not comply to the XML Schema correctly
|
78
|
+
#in some circumstances the httparty response contains a hash whereas it should be an array of hash with one item
|
79
|
+
#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
|
80
|
+
#if the input is already an Array of hash it will do nothing
|
81
|
+
#for further reference: http://stackoverflow.com/questions/28282125/httparty-response-interpretation-in-ruby/
|
82
|
+
structure = [structure] unless structure.is_a? Array
|
83
|
+
return structure
|
84
|
+
end #hashtoarray
|
85
|
+
|
86
|
+
|
87
|
+
def plans(token, serviceroot)
|
88
|
+
self.class.base_uri serviceroot
|
89
|
+
self.class.default_options[:headers] = { "Accept" => "application/xml;version=5.7", "Authorization" => "Bearer " + token }
|
90
|
+
plansarray = self.class.get('/api/sc/plans')
|
91
|
+
return plansarray
|
92
|
+
end #plans
|
93
|
+
|
94
|
+
|
95
|
+
def instances(token, serviceroot)
|
96
|
+
self.class.base_uri serviceroot
|
97
|
+
self.class.default_options[:headers] = { "Accept" => "application/xml;version=5.7", "Authorization" => "Bearer " + token }
|
98
|
+
instancesarray = self.class.get('/api/sc/instances')
|
99
|
+
instancesarray["InstanceList"]["instances"] = hashtoarray(instancesarray["InstanceList"]["instances"])
|
100
|
+
return instancesarray
|
101
|
+
end #instances
|
102
|
+
|
103
|
+
end #Sc
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
class Billing
|
109
|
+
include HTTParty
|
110
|
+
format :json
|
111
|
+
#debug_output $stderr
|
112
|
+
|
113
|
+
def servicegroups(token, serviceroot)
|
114
|
+
self.class.base_uri serviceroot
|
115
|
+
self.class.default_options[:headers] = { "Accept" => "application/json;version=5.7", "Authorization" => "Bearer " + token }
|
116
|
+
servicegroupsarray = self.class.get('/api/billing/service-groups')
|
117
|
+
return servicegroupsarray
|
118
|
+
end #servicegroups
|
119
|
+
|
120
|
+
|
121
|
+
|
122
|
+
def billedcosts(token, serviceroot, servicegroupid)
|
123
|
+
self.class.base_uri serviceroot
|
124
|
+
self.class.default_options[:headers] = { "Accept" => "application/json;version=5.7", "Authorization" => "Bearer " + token }
|
125
|
+
billedcostsarray = self.class.get('/api/billing/service-group/' + servicegroupid + '/billed-costs')
|
126
|
+
return billedcostsarray
|
127
|
+
end #billedcosts
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
def billedusage(token, serviceroot, servicegroupid)
|
133
|
+
self.class.base_uri serviceroot
|
134
|
+
self.class.default_options[:headers] = { "Accept" => "application/json;version=5.7", "Authorization" => "Bearer " + token }
|
135
|
+
billedusagearray = self.class.get('/api/billing/service-group/' + servicegroupid + '/billed-usage')
|
136
|
+
end #billedusage
|
137
|
+
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
end #Billing
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
|
148
|
+
class Metering
|
149
|
+
include HTTParty
|
150
|
+
format :json
|
151
|
+
#debug_output $stderr
|
152
|
+
|
153
|
+
|
154
|
+
def billablecosts(token, serviceroot, servicegroupid)
|
155
|
+
self.class.base_uri serviceroot
|
156
|
+
self.class.default_options[:headers] = { "Accept" => "application/json;version=5.7", "Authorization" => "Bearer " + token }
|
157
|
+
billablecostsarray = self.class.get('/api/metering/service-group/' + servicegroupid + '/billable-costs')
|
158
|
+
return billablecostsarray
|
159
|
+
end #billablecosts
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
def billableusage(token, serviceroot, instanceid)
|
164
|
+
self.class.base_uri serviceroot
|
165
|
+
self.class.default_options[:headers] = { "Accept" => "application/json;version=5.7", "Authorization" => "Bearer " + token }
|
166
|
+
billableusagearray = self.class.get('/api/metering/service-instance/' + instanceid + '/billable-usage')
|
167
|
+
return billableusagearray
|
168
|
+
end #billableusage
|
169
|
+
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
end #Metering
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
|
178
|
+
class Misc
|
179
|
+
include HTTParty
|
180
|
+
format :xml
|
181
|
+
#debug_output $stderr
|
182
|
+
|
183
|
+
def customquery(token, serviceroot, customapicall, acceptcontentspecific)
|
184
|
+
if acceptcontentspecific != nil
|
185
|
+
acceptcontent = "application/xml" + ";class=" + acceptcontentspecific + ";version=5.7"
|
186
|
+
end
|
187
|
+
self.class.base_uri serviceroot
|
188
|
+
puts acceptcontent
|
189
|
+
self.class.default_options[:headers] = { "Accept" => acceptcontent, "Authorization" => "Bearer " + token }
|
190
|
+
customresult = self.class.get(customapicall)
|
191
|
+
return customresult
|
192
|
+
end #customquery
|
193
|
+
|
194
|
+
|
195
|
+
def extractendpoint(instanceattributes)
|
196
|
+
#I turn the string into a hash
|
197
|
+
attributes = JSON.parse(instanceattributes)
|
198
|
+
#I return the orgname and sessionuri values in the hash (note that I clean the uri to only provide the FQDN)
|
199
|
+
return attributes["orgName"], attributes["sessionUri"][0..-14]
|
200
|
+
end #extractendpoint
|
201
|
+
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
end #Misc
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
#################################################################################
|
2
|
+
#### Massimo Re Ferre' ####
|
3
|
+
#### www.it20.info ####
|
4
|
+
#### vcautils, a set of utilities for vCloud Air Consumers ####
|
5
|
+
#################################################################################
|
6
|
+
|
7
|
+
class Vchs
|
8
|
+
include HTTParty
|
9
|
+
format :xml
|
10
|
+
#debug_output $stderr
|
11
|
+
|
12
|
+
|
13
|
+
def hashtoarray(structure)
|
14
|
+
#this function work arounds an issue of httparty (and other REST clients apparently) that do not comply to the XML Schema correctly
|
15
|
+
#in some circumstances the httparty response contains a hash whereas it should be an array of hash with one item
|
16
|
+
#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
|
17
|
+
#if the input is already an Array of hash it will do nothing
|
18
|
+
#for further reference: http://stackoverflow.com/questions/28282125/httparty-response-interpretation-in-ruby/
|
19
|
+
structure = [structure] unless structure.is_a? Array
|
20
|
+
return structure
|
21
|
+
end #hashtoarray
|
22
|
+
|
23
|
+
|
24
|
+
def login(username, password, subscriptionserviceroot)
|
25
|
+
self.class.base_uri subscriptionserviceroot
|
26
|
+
#Avoid setting the basic_auth as (due to an httparty problem) it propagates and gets retained for other calls inside the class
|
27
|
+
#self.class.basic_auth username, password
|
28
|
+
auth_token = Base64.encode64(username + ":" + password)
|
29
|
+
self.class.default_options[:headers] = {"Accept" => "application/xml;version=5.6", "Authorization" => "Basic " + auth_token}
|
30
|
+
response = self.class.post('/api/vchs/sessions')
|
31
|
+
token = response.headers['x-vchs-authorization']
|
32
|
+
return token
|
33
|
+
end #login
|
34
|
+
|
35
|
+
|
36
|
+
def services(token, subscriptionserviceroot)
|
37
|
+
self.class.base_uri subscriptionserviceroot
|
38
|
+
self.class.default_options[:headers] = { "Accept" => "application/xml;version=5.6", "x-vchs-authorization" => token }
|
39
|
+
servicesarray = self.class.get('/api/vchs/services')
|
40
|
+
servicesarray["Services"]["Service"] = hashtoarray(servicesarray["Services"]["Service"])
|
41
|
+
return servicesarray
|
42
|
+
end #services
|
43
|
+
|
44
|
+
|
45
|
+
def vdcs(token,href)
|
46
|
+
self.class.base_uri href
|
47
|
+
self.class.default_options[:headers] = { "Accept" => "application/xml;version=5.6", "x-vchs-authorization" => token }
|
48
|
+
vdcssarray = self.class.get('')
|
49
|
+
vdcssarray["Compute"]["VdcRef"] = hashtoarray(vdcssarray["Compute"]["VdcRef"])
|
50
|
+
return vdcssarray
|
51
|
+
end #vdcs
|
52
|
+
|
53
|
+
|
54
|
+
def computeattributes(token,href)
|
55
|
+
self.class.base_uri href
|
56
|
+
self.class.default_options[:headers] = { "Accept" => "application/xml;version=5.6", "x-vchs-authorization" => token }
|
57
|
+
computeattributes = self.class.post('')
|
58
|
+
return computeattributes
|
59
|
+
end #computeattributes
|
60
|
+
|
61
|
+
|
62
|
+
end #Subscription
|
63
|
+
|