foreman_azure_rm 1.3.1 → 2.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +36 -8
- data/app/controllers/foreman_azure_rm/concerns/hosts_controller_extensions.rb +6 -6
- data/app/models/concerns/foreman_azure_rm/vm_extensions/managed_vm.rb +216 -0
- data/app/models/foreman_azure_rm/azure_rm.rb +132 -188
- data/app/models/foreman_azure_rm/azure_rm_compute.rb +95 -0
- data/app/views/compute_resources/form/_azurerm.html.erb +6 -7
- data/app/views/compute_resources_vms/form/azurerm/_base.html.erb +62 -67
- data/app/views/compute_resources_vms/index/_azurerm.html.erb +3 -3
- data/app/views/compute_resources_vms/show/_azurerm.html.erb +17 -5
- data/lib/foreman_azure_rm.rake +13 -0
- data/lib/foreman_azure_rm/azure_sdk_adapter.rb +141 -0
- data/lib/foreman_azure_rm/engine.rb +16 -57
- data/lib/foreman_azure_rm/version.rb +2 -2
- metadata +109 -20
- data/app/models/concerns/fog_extensions/azurerm/compute.rb +0 -249
- data/app/models/concerns/fog_extensions/azurerm/data_disk.rb +0 -24
- data/app/models/concerns/fog_extensions/azurerm/managed_disk.rb +0 -10
- data/app/models/concerns/fog_extensions/azurerm/managed_disks.rb +0 -15
- data/app/models/concerns/fog_extensions/azurerm/network_interface.rb +0 -19
- data/app/models/concerns/fog_extensions/azurerm/network_interfaces.rb +0 -16
- data/app/models/concerns/fog_extensions/azurerm/server.rb +0 -131
- data/app/models/concerns/fog_extensions/azurerm/servers.rb +0 -23
- data/app/views/compute_resources_vms/form/azurerm/_volume.html.erb +0 -22
@@ -0,0 +1,95 @@
|
|
1
|
+
module ForemanAzureRM
|
2
|
+
class AzureRMCompute
|
3
|
+
attr_accessor :sdk
|
4
|
+
attr_accessor :azure_vm
|
5
|
+
|
6
|
+
delegate :name, to: :azure_vm, allow_nil: true
|
7
|
+
|
8
|
+
def initialize(azure_vm: ComputeModels::VirtualMachine.new, sdk: sdk)
|
9
|
+
@azure_vm = azure_vm
|
10
|
+
@sdk = sdk
|
11
|
+
end
|
12
|
+
|
13
|
+
def id
|
14
|
+
@azure_vm.id
|
15
|
+
end
|
16
|
+
|
17
|
+
def persisted?
|
18
|
+
!!identity && !!id
|
19
|
+
end
|
20
|
+
|
21
|
+
def vm_size
|
22
|
+
@azure_vm.hardware_profile.vm_size
|
23
|
+
end
|
24
|
+
|
25
|
+
def wait_for(_timeout = 0, _interval = 0, &block)
|
26
|
+
instance_eval(&block)
|
27
|
+
return true
|
28
|
+
end
|
29
|
+
|
30
|
+
def ready?
|
31
|
+
vm_status == 'running'
|
32
|
+
end
|
33
|
+
|
34
|
+
def state
|
35
|
+
vm_status
|
36
|
+
end
|
37
|
+
|
38
|
+
def vm_status
|
39
|
+
sdk.check_vm_status(@azure_vm.resource_group, name)
|
40
|
+
end
|
41
|
+
|
42
|
+
def network_interface_card_ids
|
43
|
+
nics = @azure_vm.network_profile.network_interfaces
|
44
|
+
nics.map(&:id)
|
45
|
+
end
|
46
|
+
|
47
|
+
def provisioning_ip_address
|
48
|
+
interfaces.each do |nic|
|
49
|
+
nic.ip_configurations.each do |configuration|
|
50
|
+
next unless configuration.primary
|
51
|
+
if configuration.public_ipaddress.present?
|
52
|
+
ip_id = configuration.public_ipaddress.id
|
53
|
+
ip_rg = ip_id.split('/')[4]
|
54
|
+
ip_name = ip_id.split('/')[-1]
|
55
|
+
public_ip = sdk.public_ip(ip_rg, ip_name)
|
56
|
+
return public_ip.ip_address
|
57
|
+
else
|
58
|
+
return configuration.private_ipaddress
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def interfaces
|
65
|
+
interfaces = []
|
66
|
+
unless network_interface_card_ids.nil?
|
67
|
+
network_interface_card_ids.each do |nic_id|
|
68
|
+
nic_rg = nic_id.split('/')[4]
|
69
|
+
nic_name = nic_id.split('/')[-1]
|
70
|
+
interfaces << sdk.vm_nic(nic_rg, nic_name)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
interfaces
|
74
|
+
end
|
75
|
+
|
76
|
+
def interfaces=(setifaces)
|
77
|
+
@azure_vm.network_profile.network_interfaces = setifaces
|
78
|
+
end
|
79
|
+
|
80
|
+
def ip_addresses
|
81
|
+
[]
|
82
|
+
end
|
83
|
+
|
84
|
+
def identity
|
85
|
+
@azure_vm.name
|
86
|
+
end
|
87
|
+
|
88
|
+
def identity=(setuuid)
|
89
|
+
@azure_vm.name = setuuid
|
90
|
+
end
|
91
|
+
|
92
|
+
def image_id
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
<%= text_f f, :url, :label => _('Client ID'), :required => true %>
|
2
|
-
<%= password_f f, :password, :label => _('Client Secret'), :required => true %>
|
2
|
+
<%= password_f f, :password, :label => _('Client Secret'), :keep_value => true, :required => true %>
|
3
3
|
<%= text_f f, :user, :label => _('Subscription ID'), :required => true %>
|
4
|
-
<%= text_f f, :uuid, :label => _('Tenant ID'), :required => true
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
hidden_spinner('', :id => 'test_connection_indicator').html_safe %>
|
4
|
+
<%= text_f f, :uuid, :label => _('Tenant ID'), :required => true %>
|
5
|
+
|
6
|
+
<div class="col-md-offset-2">
|
7
|
+
<%= test_connection_button_f(f, true) %>
|
8
|
+
</div>
|
@@ -5,13 +5,13 @@
|
|
5
5
|
%>
|
6
6
|
|
7
7
|
<script>
|
8
|
-
function
|
9
|
-
|
10
|
-
|
8
|
+
function azure_rm_region_callback() {
|
9
|
+
azure_rm_get_size_from_region();
|
10
|
+
azure_rm_subnets_from_region();
|
11
11
|
}
|
12
12
|
|
13
|
-
function
|
14
|
-
var
|
13
|
+
function azure_rm_get_size_from_region() {
|
14
|
+
var region = $('#azure_rm_region').val();
|
15
15
|
var size_spinner = $('#azure_rm_size_spinner');
|
16
16
|
var sizes = $('#azure_rm_size');
|
17
17
|
var imageId = $('#azure_rm_image_id').val();
|
@@ -22,7 +22,7 @@
|
|
22
22
|
}
|
23
23
|
size_spinner.removeClass('hide');
|
24
24
|
$.ajax({
|
25
|
-
data: {"
|
25
|
+
data: {"region_string": region, "image_id": imageId},
|
26
26
|
type: 'get',
|
27
27
|
url: '/azure_rm/sizes',
|
28
28
|
complete: function () {
|
@@ -47,19 +47,19 @@
|
|
47
47
|
});
|
48
48
|
}
|
49
49
|
|
50
|
-
function
|
50
|
+
function azure_rm_subnets_from_region() {
|
51
51
|
var imageId = $('#azure_rm_image_id').val();
|
52
52
|
var subnets = $('#azure_rm_subnet');
|
53
|
-
var
|
53
|
+
var region = $('#azure_rm_region').val();
|
54
54
|
if (typeof tfm == 'undefined') { // earlier than 1.13
|
55
55
|
foreman.tools.showSpinner();
|
56
56
|
} else {
|
57
57
|
tfm.tools.showSpinner();
|
58
58
|
}
|
59
59
|
$.ajax({
|
60
|
-
data: {"image_id": imageId, "
|
61
|
-
type:
|
62
|
-
url:
|
60
|
+
data: {"image_id": imageId, "region": region},
|
61
|
+
type: 'get',
|
62
|
+
url: '/azure_rm/subnets',
|
63
63
|
complete: function () {
|
64
64
|
reloadOnAjaxComplete('#azure_rm_subnet');
|
65
65
|
if (typeof tfm == 'undefined') { // earlier than 1.13
|
@@ -77,33 +77,39 @@
|
|
77
77
|
subnets.empty();
|
78
78
|
$.each(request_subnets, function () {
|
79
79
|
//noinspection JSAnnotator
|
80
|
-
subnets.append($("<option />").val(this.id).text(`${this.
|
80
|
+
subnets.append($("<option />").val(this.id).text(`${this.id.split('/')[8]} - ${this.name} (${this.address_prefix})`));
|
81
81
|
});
|
82
82
|
}
|
83
83
|
});
|
84
84
|
}
|
85
85
|
</script>
|
86
86
|
|
87
|
-
|
88
|
-
|
89
|
-
{
|
90
|
-
:label => _('Azure Region'),
|
91
|
-
:required => true,
|
92
|
-
:id => 'azure_rm_location',
|
93
|
-
:label_size => "col-md-2",
|
94
|
-
:onchange => 'azure_rm_location_callback();',
|
95
|
-
:help_inline => spinner_button_f(f, _('Reload Images, Sizes, vNets'),
|
96
|
-
'azure_rm_location_callback();',
|
97
|
-
{
|
98
|
-
:id => 'load_subnets_btn',
|
99
|
-
:spinner_id => 'load_subnets_indicator',
|
100
|
-
:class => 'btn-success',
|
101
|
-
:spinner_class => 'spinner-inverse'
|
102
|
-
})
|
103
|
-
}
|
87
|
+
<% #This view has been modified and wraps the properties of azure_vm
|
88
|
+
# using fields_for rails method.
|
104
89
|
%>
|
105
90
|
|
106
|
-
<%=
|
91
|
+
<%= f.fields_for :azure_vm do |vm_f| %>
|
92
|
+
|
93
|
+
<%= selectable_f vm_f, :location, compute_resource.regions,
|
94
|
+
{ :include_blank => _('Please select an Azure region') },
|
95
|
+
{
|
96
|
+
:label => _('Azure Region'),
|
97
|
+
:required => true,
|
98
|
+
:id => 'azure_rm_region',
|
99
|
+
:label_size => "col-md-2",
|
100
|
+
:onchange => 'azure_rm_region_callback();',
|
101
|
+
:help_inline => spinner_button_f(f, _('Reload Images, Sizes, vNets'),
|
102
|
+
'azure_rm_region_callback();',
|
103
|
+
{
|
104
|
+
:id => 'load_subnets_btn',
|
105
|
+
:spinner_id => 'load_subnets_indicator',
|
106
|
+
:class => 'btn-success',
|
107
|
+
:spinner_class => 'spinner-inverse'
|
108
|
+
})
|
109
|
+
}
|
110
|
+
%>
|
111
|
+
|
112
|
+
<%= selectable_f vm_f, :resource_group, resource_groups,
|
107
113
|
{ :include_blank => true },
|
108
114
|
{
|
109
115
|
:disabled => resource_groups.empty?,
|
@@ -111,87 +117,76 @@
|
|
111
117
|
:required => true,
|
112
118
|
:id => 'azure_rm_rg'
|
113
119
|
}
|
114
|
-
%>
|
120
|
+
%>
|
115
121
|
|
116
|
-
<%= selectable_f
|
122
|
+
<%= selectable_f vm_f, :vm_size, [],
|
117
123
|
{ :include_blank => _('Please first select an Azure region') },
|
118
124
|
{
|
119
125
|
:label => _('VM Size'),
|
120
126
|
:required => true,
|
121
127
|
:id => 'azure_rm_size'
|
122
128
|
}
|
123
|
-
%>
|
129
|
+
%>
|
124
130
|
|
125
|
-
<%= selectable_f
|
131
|
+
<%= selectable_f vm_f, :platform, %w(Linux Windows),
|
126
132
|
{},
|
127
133
|
{
|
128
134
|
:label => _('Platform'),
|
129
135
|
:required => true
|
130
136
|
}
|
131
|
-
%>
|
137
|
+
%>
|
132
138
|
|
133
|
-
<%= text_f
|
139
|
+
<%= text_f vm_f, :username,
|
134
140
|
{
|
135
141
|
:label => _('Username'),
|
136
142
|
:required => true
|
137
143
|
}
|
138
|
-
%>
|
139
|
-
|
144
|
+
%>
|
145
|
+
|
146
|
+
<%= password_f vm_f, :password,
|
140
147
|
{
|
141
148
|
:label => _('Password'),
|
142
|
-
:required => true
|
149
|
+
:required => true,
|
150
|
+
:placeholder => "********"
|
143
151
|
}
|
144
|
-
%>
|
152
|
+
%>
|
145
153
|
|
146
|
-
<%= textarea_f
|
154
|
+
<%= textarea_f vm_f, :ssh_key_data,
|
147
155
|
{
|
148
156
|
:label => _('SSH Key')
|
149
157
|
}
|
150
|
-
%>
|
151
|
-
|
152
|
-
<%= number_f f, :os_disk_size,
|
153
|
-
{
|
154
|
-
:class => "col-md-2",
|
155
|
-
:label => _('OS Disk Size (GB)'), :label_size => "col-md-2",
|
156
|
-
:required => true
|
157
|
-
}
|
158
|
-
%>
|
158
|
+
%>
|
159
159
|
|
160
|
-
<%= checkbox_f
|
160
|
+
<%= checkbox_f vm_f, :premium_os_disk,
|
161
161
|
{
|
162
162
|
:label => _('Premium OS Disk'), :label_size => "col-md-2"
|
163
163
|
},
|
164
164
|
'true',
|
165
165
|
'false'
|
166
|
-
%>
|
166
|
+
%>
|
167
167
|
|
168
|
-
<%= selectable_f
|
168
|
+
<%= selectable_f vm_f, :os_disk_caching, %w(None ReadOnly ReadWrite),
|
169
169
|
{},
|
170
170
|
{
|
171
171
|
:label => _('OS Disk Caching'),
|
172
172
|
:required => true,
|
173
173
|
:class => "col-md-2"
|
174
174
|
}
|
175
|
-
%>
|
176
|
-
|
177
|
-
<%= text_f f, :puppet_master,
|
178
|
-
{
|
179
|
-
:label => _('Puppet Master'),
|
180
|
-
:help_inline => _('For the Azure Puppet extension for Windows')
|
181
|
-
}
|
182
|
-
%>
|
175
|
+
%>
|
183
176
|
|
184
|
-
<%= text_f
|
177
|
+
<%= text_f vm_f, :script_command,
|
185
178
|
{
|
186
|
-
:label => _('Custom Script Command')
|
179
|
+
:label => _('Custom Script Command'),
|
180
|
+
:help_inline => _("To perform commands as root, prefix it with 'sudo'.")
|
187
181
|
}
|
188
|
-
%>
|
182
|
+
%>
|
189
183
|
|
190
|
-
<%= text_f
|
184
|
+
<%= text_f vm_f, :script_uris,
|
191
185
|
{
|
192
186
|
:label => _('Comma seperated file URIs')
|
193
187
|
}
|
194
|
-
%>
|
188
|
+
%>
|
189
|
+
<% end %>
|
195
190
|
|
196
191
|
<div id="image_selection">
|
197
192
|
<%= select_f f, :image_id, images, :uuid, :name,
|
@@ -204,4 +199,4 @@
|
|
204
199
|
:id => 'azure_rm_image_id'
|
205
200
|
}
|
206
201
|
%>
|
207
|
-
</div>
|
202
|
+
</div>
|
@@ -13,8 +13,8 @@
|
|
13
13
|
<tr>
|
14
14
|
<td><%= link_to_if_authorized vm.name, hash_for_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => vm.identity).merge(:auth_object => @compute_resource, :authorizer => :authorizer) %></td>
|
15
15
|
<td><%= vm.vm_size %></td>
|
16
|
-
<td><%= vm.resource_group %></td>
|
17
|
-
<td><%= vm.location %></td>
|
16
|
+
<td><%= vm.azure_vm.resource_group %></td>
|
17
|
+
<td><%= vm.azure_vm.location %></td>
|
18
18
|
<td> <span <%= vm_power_class(vm.ready?) %>> <%= vm_state(vm) %> </span> </td>
|
19
19
|
<td>
|
20
20
|
<%= action_buttons(
|
@@ -26,4 +26,4 @@
|
|
26
26
|
</td>
|
27
27
|
</tr>
|
28
28
|
<% end %>
|
29
|
-
</table>
|
29
|
+
</table>
|
@@ -1,14 +1,26 @@
|
|
1
|
-
<% title @vm.name %>
|
1
|
+
<% title @vm.azure_vm.name %>
|
2
2
|
<div class='col-md-12'>
|
3
3
|
<table class="<%= table_css_classes %>">
|
4
4
|
<thead>
|
5
5
|
<tr><th colspan="2"><%=_('Properties') %></th></tr>
|
6
6
|
</thead>
|
7
7
|
<tbody>
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
<tr>
|
9
|
+
<td>Id</td>
|
10
|
+
<td><%=@vm.id%></td>
|
11
|
+
</tr>
|
12
|
+
<tr>
|
13
|
+
<td>Location</td>
|
14
|
+
<td><%=@vm.azure_vm.location%></td>
|
15
|
+
</tr>
|
16
|
+
<tr>
|
17
|
+
<td>VM Size</td>
|
18
|
+
<td><%=@vm.vm_size%></td>
|
19
|
+
</tr>
|
20
|
+
<tr>
|
21
|
+
<td>Platform</td>
|
22
|
+
<td><%=@vm.azure_vm.storage_profile.os_disk.os_type%></td>
|
23
|
+
</tr>
|
12
24
|
</tbody>
|
13
25
|
</table>
|
14
26
|
</div>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Tests
|
4
|
+
namespace :test do
|
5
|
+
desc 'Test foreman_azure_rm'
|
6
|
+
Rake::TestTask.new(:foreman_azure_rm) do |t|
|
7
|
+
test_dir = File.join(File.dirname(__FILE__), '..', 'test')
|
8
|
+
t.libs << ['test', test_dir]
|
9
|
+
t.pattern = "#{test_dir}/**/*_test.rb"
|
10
|
+
t.verbose = true
|
11
|
+
t.warning = false
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
module ForemanAzureRM
|
2
|
+
Storage = Azure::Storage::Profiles::Latest::Mgmt
|
3
|
+
Network = Azure::Network::Profiles::Latest::Mgmt
|
4
|
+
Compute = Azure::Compute::Profiles::Latest::Mgmt
|
5
|
+
Resources = Azure::Resources::Profiles::Latest::Mgmt
|
6
|
+
|
7
|
+
StorageModels = Storage::Models
|
8
|
+
NetworkModels = Network::Models
|
9
|
+
ComputeModels = Compute::Models
|
10
|
+
ResourceModels = Resources::Models
|
11
|
+
|
12
|
+
class AzureSDKAdapter
|
13
|
+
def initialize(tenant, app_ident, secret_key, sub_id)
|
14
|
+
@tenant = tenant
|
15
|
+
@app_ident = app_ident
|
16
|
+
@secret_key = secret_key
|
17
|
+
@sub_id = sub_id
|
18
|
+
end
|
19
|
+
|
20
|
+
def resource_client
|
21
|
+
@resource_client ||= Resources::Client.new(azure_credentials)
|
22
|
+
end
|
23
|
+
|
24
|
+
def compute_client
|
25
|
+
@compute_client ||= Compute::Client.new(azure_credentials)
|
26
|
+
end
|
27
|
+
|
28
|
+
def network_client
|
29
|
+
@network_client ||= Network::Client.new(azure_credentials)
|
30
|
+
end
|
31
|
+
|
32
|
+
def storage_client
|
33
|
+
@storage_client ||= Storage::Client.new(azure_credentials)
|
34
|
+
end
|
35
|
+
|
36
|
+
def azure_credentials
|
37
|
+
provider = MsRestAzure::ApplicationTokenProvider.new(
|
38
|
+
@tenant,
|
39
|
+
@app_ident,
|
40
|
+
@secret_key)
|
41
|
+
|
42
|
+
credentials = MsRest::TokenCredentials.new(provider)
|
43
|
+
|
44
|
+
{
|
45
|
+
credentials: credentials,
|
46
|
+
subscription_id: @sub_id
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def rgs
|
51
|
+
rgs = resource_client.resource_groups.list
|
52
|
+
rgs.map(&:name)
|
53
|
+
end
|
54
|
+
|
55
|
+
def vnets
|
56
|
+
network_client.virtual_networks.list_all
|
57
|
+
end
|
58
|
+
|
59
|
+
def subnets(resource_group, vnet_name)
|
60
|
+
network_client.subnets.list(resource_group, vnet_name)
|
61
|
+
end
|
62
|
+
|
63
|
+
def public_ip(rg_name, pip_name)
|
64
|
+
network_client.public_ipaddresses.get(rg_name, pip_name)
|
65
|
+
end
|
66
|
+
|
67
|
+
def vm_nic(rg_name,nic_name)
|
68
|
+
network_client.network_interfaces.get(rg_name, nic_name)
|
69
|
+
end
|
70
|
+
|
71
|
+
def list_vm_sizes(region)
|
72
|
+
stripped_region = region.gsub(/\s+/, '').downcase
|
73
|
+
compute_client.virtual_machine_sizes.list(stripped_region).value()
|
74
|
+
end
|
75
|
+
|
76
|
+
def list_vms(rg_name)
|
77
|
+
# List all VMs in a resource group
|
78
|
+
virtual_machines = compute_client.virtual_machines.list(rg_name)
|
79
|
+
end
|
80
|
+
|
81
|
+
def get_vm(rg_name, vm_name)
|
82
|
+
compute_client.virtual_machines.get(rg_name, vm_name)
|
83
|
+
end
|
84
|
+
|
85
|
+
def get_storage_accts
|
86
|
+
result = storage_client.storage_accounts.list
|
87
|
+
result.value
|
88
|
+
end
|
89
|
+
|
90
|
+
def create_or_update_vm(rg_name, vm_name, parameters)
|
91
|
+
compute_client.virtual_machines.create_or_update(rg_name, vm_name, parameters)
|
92
|
+
end
|
93
|
+
|
94
|
+
def create_or_update_vm_extensions(rg_name, vm_name, vm_extension_name, extension_params)
|
95
|
+
compute_client.virtual_machine_extensions.create_or_update(rg_name,
|
96
|
+
vm_name,
|
97
|
+
vm_extension_name,
|
98
|
+
extension_params)
|
99
|
+
end
|
100
|
+
|
101
|
+
def create_or_update_pip(rg_name, pip_name, parameters)
|
102
|
+
network_client.public_ipaddresses.create_or_update(rg_name, pip_name, parameters)
|
103
|
+
end
|
104
|
+
|
105
|
+
def create_or_update_nic(rg_name, nic_name, parameters)
|
106
|
+
network_client.network_interfaces.create_or_update(rg_name, nic_name, parameters)
|
107
|
+
end
|
108
|
+
|
109
|
+
def delete_pip(rg_name, pip_name)
|
110
|
+
network_client.public_ipaddresses.delete(rg_name, pip_name)
|
111
|
+
end
|
112
|
+
|
113
|
+
def delete_nic(rg_name, nic_name)
|
114
|
+
network_client.network_interfaces.delete(rg_name, nic_name)
|
115
|
+
end
|
116
|
+
|
117
|
+
def delete_vm(rg_name, vm_name)
|
118
|
+
compute_client.virtual_machines.delete(rg_name, vm_name)
|
119
|
+
end
|
120
|
+
|
121
|
+
def delete_disk(rg_name, osdisk_name)
|
122
|
+
compute_client.disks.delete(rg_name, osdisk_name)
|
123
|
+
end
|
124
|
+
|
125
|
+
def check_vm_status(rg_name, vm_name)
|
126
|
+
virtual_machine = compute_client.virtual_machines.get(rg_name, vm_name, expand:'instanceView')
|
127
|
+
get_status(virtual_machine)
|
128
|
+
end
|
129
|
+
|
130
|
+
def get_status(virtual_machine)
|
131
|
+
vm_statuses = virtual_machine.instance_view.statuses
|
132
|
+
vm_status = nil
|
133
|
+
vm_statuses.each do |status|
|
134
|
+
if status.code.include? 'PowerState'
|
135
|
+
vm_status = status.code.split('/')[1]
|
136
|
+
end
|
137
|
+
end
|
138
|
+
vm_status
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|