azure-armrest 0.7.1 → 0.7.2
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 +6 -0
- data/lib/azure/armrest/model/base_model.rb +3 -0
- data/lib/azure/armrest/model/virtual_machine.rb +39 -0
- data/lib/azure/armrest/storage/disk_service.rb +108 -0
- data/lib/azure/armrest/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39ae852a7c1d574a83dde09cd448745e2e881388
|
4
|
+
data.tar.gz: 48c5a7219743e3b5aea2c0ca8270c7a26d9c1be2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b368e813ee681505fa2d3e5bf7d53fc86a14a410d72b00208645886e3b6c98c903d67ea5669ea96ef73dc574aa2c42ea349474eaee2e25cb482e16eb72e93884
|
7
|
+
data.tar.gz: 56abea12095d06f948eda3c6fae8bf778bede353ecdfa4df2d331d34b64e3a9b275c767bad45f7788b1c237edc44cafbd76aae837d0f881549a470c65fbd0cdf
|
data/CHANGES
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
= 0.7.2 - 26-Apr-2017
|
2
|
+
* Added the Storage::DiskService#get_blob_raw method. This is similar to the
|
3
|
+
StorageAccount#get_blob_raw method, but works for managed disks.
|
4
|
+
* Added the :managed_disk?, :size (alias :flavor) and :operating_system
|
5
|
+
(alias :os) methods to the VirtualMachine model for convenience.
|
6
|
+
|
1
7
|
= 0.7.1 - 11-Apr-2017
|
2
8
|
* Fixed a bug in the BaseModel#to_json method. It now handles arrays of
|
3
9
|
model objects properly.
|
@@ -196,6 +196,8 @@ module Azure
|
|
196
196
|
class Usage < BaseModel; end
|
197
197
|
end
|
198
198
|
|
199
|
+
class ResponseBody < BaseModel; end
|
200
|
+
|
199
201
|
class ResponseHeaders < BaseModel
|
200
202
|
undef_method :response_headers
|
201
203
|
end
|
@@ -261,3 +263,4 @@ module Azure
|
|
261
263
|
end
|
262
264
|
|
263
265
|
require_relative 'storage_account'
|
266
|
+
require_relative 'virtual_machine'
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Azure
|
2
|
+
module Armrest
|
3
|
+
class VirtualMachine < BaseModel
|
4
|
+
# Indicates whether the VM is backed by a managed disk or a regular
|
5
|
+
# storage account.
|
6
|
+
#
|
7
|
+
def managed_disk?
|
8
|
+
check_for_model_view('managed_disk?')
|
9
|
+
properties.storage_profile.os_disk.try(:managed_disk) ? true : false
|
10
|
+
end
|
11
|
+
|
12
|
+
# Returns the size (aka series) for the VM, e.g. "Standard_A0".
|
13
|
+
#
|
14
|
+
def size
|
15
|
+
check_for_model_view('size')
|
16
|
+
properties.hardware_profile.vm_size
|
17
|
+
end
|
18
|
+
|
19
|
+
alias flavor size
|
20
|
+
|
21
|
+
# The operating system for the image, e.g. "Linux" or "Windows".
|
22
|
+
#
|
23
|
+
def operating_system
|
24
|
+
check_for_model_view('operating_sytem')
|
25
|
+
properties.storage_profile.os_disk.os_type
|
26
|
+
end
|
27
|
+
|
28
|
+
alias os operating_system
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def check_for_model_view(method_name)
|
33
|
+
unless respond_to?(:properties)
|
34
|
+
raise NoMethodError, "The method '#{method_name}' is only valid for model view objects."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -11,6 +11,114 @@ module Azure
|
|
11
11
|
def initialize(configuration, options = {})
|
12
12
|
super(configuration, 'disks', 'Microsoft.Compute', options)
|
13
13
|
end
|
14
|
+
|
15
|
+
# Get the raw blob information for a managed disk. This is similar to
|
16
|
+
# the StorageAccount#get_blob_raw method, but applies only to a managed
|
17
|
+
# disk, whereas that method applies only to an individual storage
|
18
|
+
# account.
|
19
|
+
#
|
20
|
+
# As with the Storage#get_blob_raw method, you should pass a :range,
|
21
|
+
# :start_byte, :end_byte or :length option. If you want the entire
|
22
|
+
# image you must pass the :entire_image option, though this is generally
|
23
|
+
# not recommended. Unlike the Storage#get_blob_raw method, this method
|
24
|
+
# does not support the :date parameter.
|
25
|
+
#
|
26
|
+
# The +options+ are as follows:
|
27
|
+
#
|
28
|
+
# :range => A range of bytes you want, e.g. 0..1023 to get first 1k bytes
|
29
|
+
# :start_byte => The starting byte number that you want to collect bytes for. Use
|
30
|
+
# this in conjunction with :length or :end_byte.
|
31
|
+
# :end_byte => The ending byte that you want to collect bytes for. Use this
|
32
|
+
# in conjunction with :start_byte.
|
33
|
+
# :length => If given a :start_byte, specifies the number of bytes from the
|
34
|
+
# the :start_byte that you wish to collect.
|
35
|
+
# :entire_image => If set, returns the entire image in bytes. This will be a long
|
36
|
+
# running request that returns a large number of bytes.
|
37
|
+
#
|
38
|
+
# You may also pass a :duration parameter, which indicates how long, in
|
39
|
+
# seconds, that the privately generated SAS token should last. This token
|
40
|
+
# is used internally by requests that are used to access the requested
|
41
|
+
# information. By default it lasts for 1 hour.
|
42
|
+
#
|
43
|
+
# Get the information you need using:
|
44
|
+
#
|
45
|
+
# * response.body - blob data (the raw bytes).
|
46
|
+
# * response.headers - blob metadata (a hash).
|
47
|
+
#
|
48
|
+
# Example:
|
49
|
+
#
|
50
|
+
# vms = Azure::Armrest::VirtualMachineService.new(conf)
|
51
|
+
# sds = Azure::Armrest::Storage::DiskService.new(conf)
|
52
|
+
#
|
53
|
+
# vm = vms.get(vm_name, vm_resource_group)
|
54
|
+
# os_disk = vm.properties.storage_profile.os_disk
|
55
|
+
#
|
56
|
+
# disk_id = os_disk.managed_disk.id
|
57
|
+
# disk = sds.get_by_id(disk_id)
|
58
|
+
#
|
59
|
+
# # Get the first 1024 bytes
|
60
|
+
# data = sds.get_blob_raw(disk.name, disk.resource_group, :range => 0..1023)
|
61
|
+
#
|
62
|
+
# p data.headers
|
63
|
+
# File.open('vm.vhd', 'a'){ |fh| fh.write(data.body) }
|
64
|
+
#
|
65
|
+
def get_blob_raw(disk_name, resource_group = configuration.resource_group, options = {})
|
66
|
+
validate_resource_group(resource_group)
|
67
|
+
|
68
|
+
post_options = {
|
69
|
+
:access => 'read', # Must be 'read'
|
70
|
+
:durationInSeconds => options[:duration] || 3600 # 1 hour default
|
71
|
+
}
|
72
|
+
|
73
|
+
# This call will give us an operations URL in the headers.
|
74
|
+
initial_url = build_url(resource_group, disk_name, 'BeginGetAccess')
|
75
|
+
response = rest_post(initial_url, post_options.to_json)
|
76
|
+
headers = ResponseHeaders.new(response.headers)
|
77
|
+
|
78
|
+
# Using the URL returned from the above call, make another call that
|
79
|
+
# will return the URL + SAS token.
|
80
|
+
op_url = headers.try(:azure_asyncoperation) || headers.location
|
81
|
+
|
82
|
+
unless op_url
|
83
|
+
msg = "Unable to find an operations URL for #{disk_name}/#{resource_group}"
|
84
|
+
raise Azure::Armrest::NotFoundException.new(response.code, msg, response.body)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Dig the URL + SAS token URL out of the response
|
88
|
+
response = rest_get(op_url)
|
89
|
+
body = ResponseBody.new(response.body)
|
90
|
+
sas_url = body.try(:properties).try(:output).try(:access_sas)
|
91
|
+
|
92
|
+
unless sas_url
|
93
|
+
msg = "Unable to find an SAS URL for #{disk_name}/#{resource_group}"
|
94
|
+
raise Azure::Armrest::NotFoundException.new(response.code, msg, response.body)
|
95
|
+
end
|
96
|
+
|
97
|
+
# The same restrictions that apply to the StorageAccont method also apply here.
|
98
|
+
range = options[:range] if options[:range]
|
99
|
+
range ||= options[:start_byte]..options[:end_byte] if options[:start_byte] && options[:end_byte]
|
100
|
+
range ||= options[:start_byte]..options[:length]-1 if options[:start_byte] && options[:length]
|
101
|
+
|
102
|
+
range_str = range ? "bytes=#{range.min}-#{range.max}" : nil
|
103
|
+
|
104
|
+
unless range_str || options[:entire_image]
|
105
|
+
raise ArgumentError, "must specify byte range or :entire_image flag"
|
106
|
+
end
|
107
|
+
|
108
|
+
headers = {}
|
109
|
+
headers['x-ms-range'] = range_str if range_str
|
110
|
+
|
111
|
+
# Need to make a raw call since we need to explicitly pass headers,
|
112
|
+
# but without encoding the URL or passing our configuration token.
|
113
|
+
RestClient::Request.execute(
|
114
|
+
:method => :get,
|
115
|
+
:url => sas_url,
|
116
|
+
:headers => headers,
|
117
|
+
:proxy => configuration.proxy,
|
118
|
+
:ssl_version => configuration.ssl_version,
|
119
|
+
:ssl_verify => configuration.ssl_verify
|
120
|
+
)
|
121
|
+
end
|
14
122
|
end # DiskService
|
15
123
|
end # Storage
|
16
124
|
end # Armrest
|
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.7.
|
4
|
+
version: 0.7.2
|
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: 2017-04-
|
14
|
+
date: 2017-04-26 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: json
|
@@ -248,6 +248,7 @@ files:
|
|
248
248
|
- lib/azure/armrest/insights/metrics_service.rb
|
249
249
|
- lib/azure/armrest/model/base_model.rb
|
250
250
|
- lib/azure/armrest/model/storage_account.rb
|
251
|
+
- lib/azure/armrest/model/virtual_machine.rb
|
251
252
|
- lib/azure/armrest/network/inbound_nat_service.rb
|
252
253
|
- lib/azure/armrest/network/ip_address_service.rb
|
253
254
|
- lib/azure/armrest/network/load_balancer_service.rb
|
@@ -298,7 +299,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
298
299
|
version: '0'
|
299
300
|
requirements: []
|
300
301
|
rubyforge_project:
|
301
|
-
rubygems_version: 2.6.
|
302
|
+
rubygems_version: 2.6.11
|
302
303
|
signing_key:
|
303
304
|
specification_version: 4
|
304
305
|
summary: An interface for ARM/JSON Azure REST API
|