azure-armrest 0.0.3 → 0.0.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.
- checksums.yaml +4 -4
- data/CHANGES +19 -0
- data/azure-armrest.gemspec +10 -7
- data/lib/azure/armrest.rb +2 -1
- data/lib/azure/armrest/armrest_service.rb +84 -25
- data/lib/azure/armrest/availability_set_service.rb +6 -82
- data/lib/azure/armrest/exception.rb +45 -0
- data/lib/azure/armrest/model/base_model.rb +54 -31
- data/lib/azure/armrest/model/storage_account.rb +140 -0
- data/lib/azure/armrest/network/ip_address_service.rb +5 -82
- data/lib/azure/armrest/network/network_interface_service.rb +3 -110
- data/lib/azure/armrest/network/network_security_group_service.rb +3 -82
- data/lib/azure/armrest/network/subnet_service.rb +14 -29
- data/lib/azure/armrest/network/virtual_network_service.rb +3 -100
- data/lib/azure/armrest/resource_group_based_service.rb +94 -0
- data/lib/azure/armrest/resource_group_service.rb +3 -3
- data/lib/azure/armrest/resource_provider_service.rb +4 -4
- data/lib/azure/armrest/resource_service.rb +1 -1
- data/lib/azure/armrest/storage_account_service.rb +35 -139
- data/lib/azure/armrest/template_deployment_service.rb +34 -87
- data/lib/azure/armrest/version.rb +1 -1
- data/lib/azure/armrest/virtual_machine_extension_service.rb +109 -35
- data/lib/azure/armrest/virtual_machine_service.rb +30 -187
- metadata +51 -6
@@ -3,7 +3,7 @@ module Azure
|
|
3
3
|
# Armrest namespace
|
4
4
|
module Armrest
|
5
5
|
# Base class for managing virtual machines
|
6
|
-
class VirtualMachineService <
|
6
|
+
class VirtualMachineService < ResourceGroupBasedService
|
7
7
|
|
8
8
|
# The provider used in requests when gathering VM information.
|
9
9
|
attr_reader :provider
|
@@ -19,7 +19,8 @@ module Azure
|
|
19
19
|
def initialize(_armrest_configuration, options = {})
|
20
20
|
super
|
21
21
|
@provider = options[:provider] || 'Microsoft.Compute'
|
22
|
-
|
22
|
+
@service_name = 'virtualMachines'
|
23
|
+
set_service_api_version(options, @service_name)
|
23
24
|
end
|
24
25
|
|
25
26
|
# Set a new provider to use the default for other methods. This may alter
|
@@ -51,93 +52,16 @@ module Azure
|
|
51
52
|
|
52
53
|
alias sizes series
|
53
54
|
|
54
|
-
# Returns a list of available virtual machines for the given subscription
|
55
|
-
# for the provided +group+, or all resource groups if none is provided.
|
56
|
-
#
|
57
|
-
# Examples:
|
58
|
-
#
|
59
|
-
# # Get VM's for all resource groups
|
60
|
-
# vmm.list
|
61
|
-
#
|
62
|
-
# # Get VM's only for a specific group
|
63
|
-
# vmm.list('some_group')
|
64
|
-
#--
|
65
|
-
# The specific hashes we can grab are:
|
66
|
-
# p JSON.parse(resp.body)["value"][0]["properties"]["instanceView"]
|
67
|
-
# p JSON.parse(resp.body)["value"][0]["properties"]["hardwareProfile"]
|
68
|
-
# p JSON.parse(resp.body)["value"][0]["properties"]["storageProfile"]
|
69
|
-
#
|
70
|
-
def list(group = armrest_configuration.resource_group)
|
71
|
-
array = []
|
72
|
-
|
73
|
-
if group
|
74
|
-
url = build_url(group)
|
75
|
-
array << JSON.parse(rest_get(url))['value']
|
76
|
-
else
|
77
|
-
threads = []
|
78
|
-
mutex = Mutex.new
|
79
|
-
|
80
|
-
resource_groups.each do |rg|
|
81
|
-
threads << Thread.new(rg['name']) do |rgroup|
|
82
|
-
response = rest_get(build_url(rgroup))
|
83
|
-
result = JSON.parse(response)['value']
|
84
|
-
if result
|
85
|
-
mutex.synchronize{
|
86
|
-
result.each{ |hash| hash['resourceGroup'] = rgroup }
|
87
|
-
array << result
|
88
|
-
}
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
threads.each(&:join)
|
94
|
-
|
95
|
-
array = array.flatten
|
96
|
-
|
97
|
-
if provider.downcase == 'microsoft.compute'
|
98
|
-
add_network_profile(array)
|
99
|
-
add_power_status(array)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
array
|
104
|
-
end
|
105
|
-
|
106
|
-
alias get_vms list
|
107
|
-
|
108
55
|
# Captures the +vmname+ and associated disks into a reusable CSM template.
|
109
56
|
# The 3rd argument is a hash of options that supports the following keys:
|
110
57
|
#
|
111
|
-
# *
|
112
|
-
# *
|
113
|
-
# *
|
114
|
-
#
|
115
|
-
#
|
116
|
-
# The :prefix and :container options are mandatory. You may optionally
|
117
|
-
# specify the :resource_group as an option, or as the 3rd argument, but
|
118
|
-
# it is also mandatory if not already set in the constructor.
|
58
|
+
# * vhdPrefix - The prefix in the name of the blobs.
|
59
|
+
# * destinationContainerName - The name of the container inside which the image will reside.
|
60
|
+
# * overwriteVhds - Boolean that indicates whether or not to overwrite any VHD's
|
61
|
+
# with the same prefix. The default is false.
|
119
62
|
#
|
120
|
-
|
121
|
-
|
122
|
-
#
|
123
|
-
def capture(vmname, options = {}, group = nil)
|
124
|
-
prefix = options.fetch(:prefix)
|
125
|
-
container = options.fetch(:container)
|
126
|
-
overwrite = options[:overwrite] || false
|
127
|
-
group ||= options[:resource_group] || armrest_configuration.resource_group
|
128
|
-
|
129
|
-
raise ArgumentError, "no resource group provided" unless group
|
130
|
-
|
131
|
-
body = {
|
132
|
-
:vhdPrefix => prefix,
|
133
|
-
:destinationContainerName => container,
|
134
|
-
:overwriteVhds => overwrite
|
135
|
-
}.to_json
|
136
|
-
|
137
|
-
url = build_url(group, vmname, 'capture')
|
138
|
-
|
139
|
-
response = rest_post(url, body)
|
140
|
-
response.return!
|
63
|
+
def capture(vmname, options, group = armrest_configuration.resource_group)
|
64
|
+
vm_operate('capture', vmname, group, options)
|
141
65
|
end
|
142
66
|
|
143
67
|
# Creates a new virtual machine (or updates an existing one). Pass a hash
|
@@ -228,34 +152,16 @@ module Azure
|
|
228
152
|
#def create(options = {})
|
229
153
|
#end
|
230
154
|
|
231
|
-
#alias update create
|
232
|
-
|
233
155
|
# Stop the VM +vmname+ in +group+ and deallocate the tenant in Fabric.
|
234
156
|
#
|
235
157
|
def deallocate(vmname, group = armrest_configuration.resource_group)
|
236
|
-
|
237
|
-
url = build_url(group, vmname, 'deallocate')
|
238
|
-
response = rest_post(url)
|
239
|
-
response.return!
|
240
|
-
end
|
241
|
-
|
242
|
-
# Deletes the +vmname+ in +group+ that you specify. Note that associated
|
243
|
-
# disks are not deleted.
|
244
|
-
#
|
245
|
-
def delete(vmname, group = armrest_configuration.resource_group)
|
246
|
-
raise ArgumentError, "no resource group provided" unless group
|
247
|
-
url = build_url(group, vmname)
|
248
|
-
response = rest_delete(url)
|
249
|
-
response.return!
|
158
|
+
vm_operate('deallocate', vmname, group)
|
250
159
|
end
|
251
160
|
|
252
161
|
# Sets the OSState for the +vmname+ in +group+ to 'Generalized'.
|
253
162
|
#
|
254
163
|
def generalize(vmname, group = armrest_configuration.resource_group)
|
255
|
-
|
256
|
-
url = build_url(group, vmname, 'generalize')
|
257
|
-
response = rest_post(url)
|
258
|
-
response.return!
|
164
|
+
vm_operate('generalize', vmname, group)
|
259
165
|
end
|
260
166
|
|
261
167
|
# Retrieves the settings of the VM named +vmname+ in resource group
|
@@ -266,22 +172,13 @@ module Azure
|
|
266
172
|
# in the details of the information retrieved.
|
267
173
|
#
|
268
174
|
def get(vmname, group = armrest_configuration.resource_group, model_view = true)
|
269
|
-
|
270
|
-
|
271
|
-
if model_view
|
272
|
-
url = build_url(group, vmname)
|
273
|
-
else
|
274
|
-
url = build_url(group, vmname, 'instanceView')
|
275
|
-
end
|
276
|
-
|
277
|
-
JSON.parse(rest_get(url))
|
175
|
+
model_view ? super(vmname, group) : get_instance_view(vmname, group)
|
278
176
|
end
|
279
177
|
|
280
178
|
# Convenient wrapper around the get method that retrieves the model view
|
281
179
|
# for +vmname+ in resource_group +group+.
|
282
180
|
#
|
283
181
|
def get_model_view(vmname, group = armrest_configuration.resource_group)
|
284
|
-
raise ArgumentError, "no resource group provided" unless group
|
285
182
|
get(vmname, group, true)
|
286
183
|
end
|
287
184
|
|
@@ -289,8 +186,12 @@ module Azure
|
|
289
186
|
# for +vmname+ in resource_group +group+.
|
290
187
|
#
|
291
188
|
def get_instance_view(vmname, group = armrest_configuration.resource_group)
|
292
|
-
raise ArgumentError, "
|
293
|
-
|
189
|
+
raise ArgumentError, "must specify resource group" unless group
|
190
|
+
raise ArgumentError, "must specify name of the resource" unless vmname
|
191
|
+
|
192
|
+
url = build_url(group, vmname, 'instanceView')
|
193
|
+
response = rest_get(url)
|
194
|
+
VirtualMachineInstance.new(response)
|
294
195
|
end
|
295
196
|
|
296
197
|
# Restart the VM +vmname+ for the given +group+, which will default
|
@@ -300,10 +201,7 @@ module Azure
|
|
300
201
|
# which you can inspect, such as response.code or response.headers.
|
301
202
|
#
|
302
203
|
def restart(vmname, group = armrest_configuration.resource_group)
|
303
|
-
|
304
|
-
url = build_url(group, vmname, 'restart')
|
305
|
-
response = rest_post(url)
|
306
|
-
response.return!
|
204
|
+
vm_operate('restart', vmname, group)
|
307
205
|
end
|
308
206
|
|
309
207
|
# Start the VM +vmname+ for the given +group+, which will default
|
@@ -313,10 +211,7 @@ module Azure
|
|
313
211
|
# which you can inspect, such as response.code or response.headers.
|
314
212
|
#
|
315
213
|
def start(vmname, group = armrest_configuration.resource_group)
|
316
|
-
|
317
|
-
url = build_url(group, vmname, 'start')
|
318
|
-
response = rest_post(url)
|
319
|
-
response.return!
|
214
|
+
vm_operate('start', vmname, group)
|
320
215
|
end
|
321
216
|
|
322
217
|
# Stop the VM +vmname+ for the given +group+ gracefully. However,
|
@@ -326,74 +221,22 @@ module Azure
|
|
326
221
|
# which you can inspect, such as response.code or response.headers.
|
327
222
|
#
|
328
223
|
def stop(vmname, group = armrest_configuration.resource_group)
|
329
|
-
|
330
|
-
url = build_url(group, vmname, 'powerOff')
|
331
|
-
response = rest_post(url)
|
332
|
-
response.return!
|
333
|
-
end
|
334
|
-
|
335
|
-
private
|
336
|
-
|
337
|
-
def add_network_profile(vms)
|
338
|
-
vms.each { |vm|
|
339
|
-
vm['properties']['networkProfile']['networkInterfaces'].each { |net|
|
340
|
-
get_nic_profile(net)
|
341
|
-
}
|
342
|
-
}
|
224
|
+
vm_operate('powerOff', vmname, group)
|
343
225
|
end
|
344
226
|
|
345
|
-
def
|
346
|
-
|
347
|
-
Azure::Armrest::RESOURCE,
|
348
|
-
nic['id'],
|
349
|
-
"?api-version=#{@api_version}"
|
350
|
-
)
|
351
|
-
|
352
|
-
nic['properties'] = JSON.parse(rest_get(url))['properties']['ipConfigurations']
|
353
|
-
nic['properties'].each do |n|
|
354
|
-
next if n['properties']['publicIPAddress'].nil?
|
355
|
-
|
356
|
-
# public IP is a URI so we need to make another rest call to get it.
|
357
|
-
url = File.join(
|
358
|
-
Azure::Armrest::RESOURCE,
|
359
|
-
n['properties']['publicIPAddress']['id'],
|
360
|
-
"?api-version=#{@api_version}"
|
361
|
-
)
|
362
|
-
|
363
|
-
public_ip = JSON.parse(rest_get(url))['properties']['ipAddress']
|
364
|
-
n['properties']['publicIPAddress'] = public_ip
|
365
|
-
end
|
227
|
+
def model_class
|
228
|
+
VirtualMachineModel
|
366
229
|
end
|
367
230
|
|
368
|
-
|
369
|
-
vms.each do |vm|
|
370
|
-
i_view = get_instance_view(vm["name"], vm["resourceGroup"])
|
371
|
-
powerstatus_hash = i_view["statuses"].find {|h| h["code"].include? "PowerState"}
|
372
|
-
vm["powerStatus"] = powerstatus_hash['displayStatus'] unless powerstatus_hash.nil?
|
373
|
-
end
|
374
|
-
end
|
375
|
-
|
376
|
-
# If no default subscription is set, then use the first one found.
|
377
|
-
def set_default_subscription
|
378
|
-
@subscription_id ||= subscriptions.first['subscriptionId']
|
379
|
-
end
|
231
|
+
private
|
380
232
|
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
def build_url(resource_group, *args)
|
385
|
-
url = File.join(
|
386
|
-
Azure::Armrest::COMMON_URI,
|
387
|
-
armrest_configuration.subscription_id,
|
388
|
-
'resourceGroups',
|
389
|
-
resource_group,
|
390
|
-
'providers',
|
391
|
-
@provider,
|
392
|
-
'virtualMachines',
|
393
|
-
)
|
233
|
+
def vm_operate(action, vmname, group, options = {})
|
234
|
+
raise ArgumentError, "must specify resource group" unless group
|
235
|
+
raise ArgumentError, "must specify name of the vm" unless vmname
|
394
236
|
|
395
|
-
url =
|
396
|
-
url
|
237
|
+
url = build_url(group, vmname, action)
|
238
|
+
rest_post(url)
|
239
|
+
nil
|
397
240
|
end
|
398
241
|
end
|
399
242
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: azure-armrest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel J. Berger
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2015-10-
|
14
|
+
date: 2015-10-20 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: json
|
@@ -31,16 +31,16 @@ dependencies:
|
|
31
31
|
name: rest-client
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
requirements:
|
34
|
-
- -
|
34
|
+
- - '='
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
36
|
+
version: 2.0.0.rc1
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
|
-
- -
|
41
|
+
- - '='
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
43
|
+
version: 2.0.0.rc1
|
44
44
|
- !ruby/object:Gem::Dependency
|
45
45
|
name: cache_method
|
46
46
|
requirement: !ruby/object:Gem::Requirement
|
@@ -55,6 +55,48 @@ dependencies:
|
|
55
55
|
- - "~>"
|
56
56
|
- !ruby/object:Gem::Version
|
57
57
|
version: 0.2.7
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: azure-signature
|
60
|
+
requirement: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - "~>"
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 0.2.0
|
65
|
+
type: :runtime
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - "~>"
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 0.2.0
|
72
|
+
- !ruby/object:Gem::Dependency
|
73
|
+
name: activesupport
|
74
|
+
requirement: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 1.2.0
|
79
|
+
type: :runtime
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.2.0
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: nokogiri
|
88
|
+
requirement: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - "~>"
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 1.6.0
|
93
|
+
type: :runtime
|
94
|
+
prerelease: false
|
95
|
+
version_requirements: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 1.6.0
|
58
100
|
- !ruby/object:Gem::Dependency
|
59
101
|
name: bundler
|
60
102
|
requirement: !ruby/object:Gem::Requirement
|
@@ -152,12 +194,15 @@ files:
|
|
152
194
|
- lib/azure/armrest/armrest_service.rb
|
153
195
|
- lib/azure/armrest/availability_set_service.rb
|
154
196
|
- lib/azure/armrest/event_service.rb
|
197
|
+
- lib/azure/armrest/exception.rb
|
155
198
|
- lib/azure/armrest/model/base_model.rb
|
199
|
+
- lib/azure/armrest/model/storage_account.rb
|
156
200
|
- lib/azure/armrest/network/ip_address_service.rb
|
157
201
|
- lib/azure/armrest/network/network_interface_service.rb
|
158
202
|
- lib/azure/armrest/network/network_security_group_service.rb
|
159
203
|
- lib/azure/armrest/network/subnet_service.rb
|
160
204
|
- lib/azure/armrest/network/virtual_network_service.rb
|
205
|
+
- lib/azure/armrest/resource_group_based_service.rb
|
161
206
|
- lib/azure/armrest/resource_group_service.rb
|
162
207
|
- lib/azure/armrest/resource_provider_service.rb
|
163
208
|
- lib/azure/armrest/resource_service.rb
|