foreman_azure_rm 2.0.0.pre1 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/foreman_azure_rm/concerns/compute_resources_controller_extensions.rb +9 -0
- data/app/controllers/foreman_azure_rm/concerns/hosts_controller_extensions.rb +7 -7
- data/app/models/concerns/foreman_azure_rm/vm_extensions/managed_vm.rb +45 -42
- data/app/models/foreman_azure_rm/azure_rm.rb +112 -99
- data/app/models/foreman_azure_rm/azure_rm_compute.rb +91 -26
- data/app/views/api/v2/compute_resources/azurerm.json.rabl +1 -1
- data/app/views/compute_resources/form/_azurerm.html.erb +3 -1
- data/app/views/compute_resources_vms/form/azurerm/_base.html.erb +85 -91
- data/app/views/compute_resources_vms/form/azurerm/_network.html.erb +18 -10
- data/app/views/compute_resources_vms/index/_azurerm.html.erb +2 -2
- data/app/views/images/form/_azurerm.html.erb +1 -1
- data/lib/foreman_azure_rm.rb +12 -0
- data/lib/foreman_azure_rm/azure_sdk_adapter.rb +18 -14
- data/lib/foreman_azure_rm/engine.rb +8 -2
- data/lib/foreman_azure_rm/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a507325a26003d06dcc112040e5915d39306b9681ec21253e618da875846e56
|
4
|
+
data.tar.gz: 771298a3fc115f85b24d90198ba53a5a093e85661d4aa4da958c6a01ea437b3e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f29267ea139f9e9fb18697dc828d33ea30c0d5fcd433b21be427ec93912d5113b4278fbfd6ffb9282d2ad05f5d3142047b11e4b912afdb3bb5e454019599c968
|
7
|
+
data.tar.gz: 5603751a843f247708743e8e639b27575080ac2c709c2efbd77c591805d14713c8c3a5995610c9162f6b6c7c2d23a6f7f015204dab0641e34079c0a49a9ae69c
|
@@ -3,6 +3,15 @@ module ForemanAzureRM
|
|
3
3
|
module ComputeResourcesControllerExtensions
|
4
4
|
include Api::Version2
|
5
5
|
include Foreman::Controller::Parameters::ComputeResource
|
6
|
+
extend ::Apipie::DSL::Concern
|
7
|
+
update_api(:create, :update) do
|
8
|
+
param :compute_resource, Hash do
|
9
|
+
# Not adding :tenant as already specified in core.
|
10
|
+
param :app_ident, String, :desc => N_("Client ID for AzureRM")
|
11
|
+
param :secret_key, String, :desc => N_("Client Secret for AzureRM")
|
12
|
+
param :sub_id, String, :desc => N_("Subscription ID for AzureRM")
|
13
|
+
end
|
14
|
+
end
|
6
15
|
|
7
16
|
def available_resource_groups
|
8
17
|
compute_resource = ComputeResource.find_by_id(params[:id])
|
@@ -1,11 +1,12 @@
|
|
1
1
|
module ForemanAzureRM
|
2
2
|
module Concerns
|
3
3
|
module HostsControllerExtensions
|
4
|
+
extend ActiveSupport::Concern
|
4
5
|
|
5
6
|
def sizes
|
6
|
-
|
7
|
-
|
8
|
-
render :json =>
|
7
|
+
azure_rm_resource = ComputeResource.unscoped.find_by_id(params[:compute_resource_id])
|
8
|
+
if azure_rm_resource.present?
|
9
|
+
render :json => azure_rm_resource.vm_sizes.map { |size| size.name }
|
9
10
|
else
|
10
11
|
no_sizes = _('The region you selected has no sizes associated with it')
|
11
12
|
render :json => "[\"#{no_sizes}\"]"
|
@@ -13,10 +14,9 @@ module ForemanAzureRM
|
|
13
14
|
end
|
14
15
|
|
15
16
|
def subnets
|
16
|
-
|
17
|
-
if
|
18
|
-
|
19
|
-
subnets = azure_rm_resource.subnets(params[:region])
|
17
|
+
azure_rm_resource = ComputeResource.unscoped.find_by_id(params[:compute_resource_id])
|
18
|
+
if azure_rm_resource.present?
|
19
|
+
subnets = azure_rm_resource.subnets
|
20
20
|
if subnets.present?
|
21
21
|
render :json => subnets
|
22
22
|
else
|
@@ -35,7 +35,7 @@ module ForemanAzureRM
|
|
35
35
|
os_disk.managed_disk = managed_disk_params
|
36
36
|
storage_profile.os_disk = os_disk
|
37
37
|
|
38
|
-
#
|
38
|
+
# TODO - disk creation for volume capability
|
39
39
|
|
40
40
|
if vhd_path.nil?
|
41
41
|
# We are using a marketplace image
|
@@ -72,45 +72,44 @@ module ForemanAzureRM
|
|
72
72
|
network_profile
|
73
73
|
end
|
74
74
|
|
75
|
-
def create_nics(args = {})
|
75
|
+
def create_nics(region, args = {})
|
76
76
|
nics = []
|
77
|
-
formatted_region = args[:azure_vm][:location].gsub(/\s+/, '').downcase
|
78
77
|
args[:interfaces_attributes].each do |nic, attrs|
|
79
|
-
attrs[:
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
if pip_alloc.present?
|
78
|
+
private_ip = (attrs[:private_ip] == 'false') ? false : true
|
79
|
+
priv_ip_alloc = if private_ip
|
80
|
+
NetworkModels::IPAllocationMethod::Static
|
81
|
+
else
|
82
|
+
NetworkModels::IPAllocationMethod::Dynamic
|
83
|
+
end
|
84
|
+
pub_ip_alloc = case attrs[:public_ip]
|
85
|
+
when 'Static'
|
86
|
+
NetworkModels::IPAllocationMethod::Static
|
87
|
+
when 'Dynamic'
|
88
|
+
NetworkModels::IPAllocationMethod::Dynamic
|
89
|
+
when 'None'
|
90
|
+
nil
|
91
|
+
end
|
92
|
+
if pub_ip_alloc.present?
|
95
93
|
public_ip_params = NetworkModels::PublicIPAddress.new.tap do |ip|
|
96
|
-
ip.location =
|
97
|
-
ip.public_ipallocation_method =
|
94
|
+
ip.location = region
|
95
|
+
ip.public_ipallocation_method = pub_ip_alloc
|
98
96
|
end
|
99
|
-
|
100
|
-
|
97
|
+
|
98
|
+
pip = sdk.create_or_update_pip(args[:resource_group],
|
99
|
+
"#{args[:vm_name]}-pip#{nic}",
|
101
100
|
public_ip_params)
|
102
101
|
end
|
103
102
|
new_nic = sdk.create_or_update_nic(
|
104
|
-
args[:
|
105
|
-
"#{args[:
|
103
|
+
args[:resource_group],
|
104
|
+
"#{args[:vm_name]}-nic#{nic}",
|
106
105
|
NetworkModels::NetworkInterface.new.tap do |interface|
|
107
|
-
interface.location =
|
106
|
+
interface.location = region
|
108
107
|
interface.ip_configurations = [
|
109
108
|
NetworkModels::NetworkInterfaceIPConfiguration.new.tap do |nic_conf|
|
110
|
-
nic_conf.name = "#{args[:
|
109
|
+
nic_conf.name = "#{args[:vm_name]}-nic#{nic}"
|
111
110
|
nic_conf.private_ipallocation_method = priv_ip_alloc
|
112
|
-
nic_conf.subnet = subnets
|
113
|
-
nic_conf.public_ipaddress = pip
|
111
|
+
nic_conf.subnet = subnets.select{ |subnet| subnet.id == attrs[:network] }.first
|
112
|
+
nic_conf.public_ipaddress = pip
|
114
113
|
end
|
115
114
|
]
|
116
115
|
end
|
@@ -120,7 +119,7 @@ module ForemanAzureRM
|
|
120
119
|
nics
|
121
120
|
end
|
122
121
|
|
123
|
-
def
|
122
|
+
def initialize_vm(vm_hash)
|
124
123
|
custom_data = vm_hash[:custom_data]
|
125
124
|
msg = "Creating Virtual Machine #{vm_hash[:name]} in Resource Group #{vm_hash[:resource_group]}."
|
126
125
|
logger.debug msg
|
@@ -183,30 +182,34 @@ module ForemanAzureRM
|
|
183
182
|
vm.hardware_profile = ComputeModels::HardwareProfile.new.tap do |hw_profile|
|
184
183
|
hw_profile.vm_size = vm_hash[:vm_size]
|
185
184
|
end
|
186
|
-
vm.network_profile = define_network_profile(vm_hash[:network_interface_card_ids])
|
187
185
|
end
|
188
186
|
|
189
|
-
|
190
|
-
|
191
|
-
|
187
|
+
vm_create_params
|
188
|
+
end
|
189
|
+
|
190
|
+
def create_managed_virtual_machine(vm_hash)
|
191
|
+
vm_params = initialize_vm(vm_hash)
|
192
|
+
vm_params.network_profile = define_network_profile(vm_hash[:network_interface_card_ids])
|
193
|
+
sdk.create_or_update_vm(vm_hash[:resource_group], vm_hash[:name], vm_params)
|
192
194
|
end
|
193
195
|
|
194
|
-
def create_vm_extension(args = {})
|
195
|
-
if args[:
|
196
|
+
def create_vm_extension(region, args = {})
|
197
|
+
if args[:script_command].present? || args[:script_uris].present?
|
198
|
+
args[:script_uris] ||= args[:script_uris].to_s
|
196
199
|
extension = ComputeModels::VirtualMachineExtension.new
|
197
|
-
if args[:
|
200
|
+
if args[:platform] == 'Linux'
|
198
201
|
extension.publisher = 'Microsoft.Azure.Extensions'
|
199
202
|
extension.virtual_machine_extension_type = 'CustomScript'
|
200
203
|
extension.type_handler_version = '2.0'
|
201
204
|
end
|
202
205
|
extension.auto_upgrade_minor_version = true
|
203
|
-
extension.location =
|
206
|
+
extension.location = region
|
204
207
|
extension.settings = {
|
205
|
-
'commandToExecute' => args[:
|
206
|
-
'fileUris' => args[:
|
208
|
+
'commandToExecute' => args[:script_command],
|
209
|
+
'fileUris' => args[:script_uris].split(',')
|
207
210
|
}
|
208
|
-
sdk.create_or_update_vm_extensions(args[:
|
209
|
-
args[:
|
211
|
+
sdk.create_or_update_vm_extensions(args[:resource_group],
|
212
|
+
args[:vm_name],
|
210
213
|
'ForemanCustomScript',
|
211
214
|
extension)
|
212
215
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# This Model contains code modified as per azure-sdk
|
2
2
|
# and removed dependencies from fog-azure-rm.
|
3
|
-
|
3
|
+
|
4
4
|
require 'base64'
|
5
5
|
|
6
6
|
module ForemanAzureRM
|
@@ -9,13 +9,10 @@ module ForemanAzureRM
|
|
9
9
|
include VMExtensions::ManagedVM
|
10
10
|
alias_attribute :sub_id, :user
|
11
11
|
alias_attribute :secret_key, :password
|
12
|
-
alias_attribute :
|
12
|
+
alias_attribute :region, :url
|
13
13
|
alias_attribute :tenant, :uuid
|
14
14
|
|
15
|
-
validates :user, :presence => true
|
16
|
-
validates :password, :presence => true
|
17
|
-
validates :url, :presence => true
|
18
|
-
validates :uuid, :presence => true
|
15
|
+
validates :user, :password, :url, :uuid, :app_ident, :presence => true
|
19
16
|
|
20
17
|
has_one :key_pair, :foreign_key => :compute_resource_id, :dependent => :destroy
|
21
18
|
|
@@ -23,6 +20,7 @@ module ForemanAzureRM
|
|
23
20
|
|
24
21
|
class VMContainer
|
25
22
|
attr_accessor :virtualmachines
|
23
|
+
delegate :each, to: :virtualmachines
|
26
24
|
|
27
25
|
def initialize
|
28
26
|
@virtualmachines = []
|
@@ -33,6 +31,14 @@ module ForemanAzureRM
|
|
33
31
|
end
|
34
32
|
end
|
35
33
|
|
34
|
+
def app_ident
|
35
|
+
attrs[:app_ident]
|
36
|
+
end
|
37
|
+
|
38
|
+
def app_ident=(name)
|
39
|
+
attrs[:app_ident] = name
|
40
|
+
end
|
41
|
+
|
36
42
|
def sdk
|
37
43
|
@sdk ||= ForemanAzureRM::AzureSDKAdapter.new(tenant, app_ident, secret_key, sub_id)
|
38
44
|
end
|
@@ -45,7 +51,7 @@ module ForemanAzureRM
|
|
45
51
|
ComputeResource.model_name
|
46
52
|
end
|
47
53
|
|
48
|
-
def provider_friendly_name
|
54
|
+
def self.provider_friendly_name
|
49
55
|
'Azure Resource Manager'
|
50
56
|
end
|
51
57
|
|
@@ -55,33 +61,18 @@ module ForemanAzureRM
|
|
55
61
|
|
56
62
|
def regions
|
57
63
|
[
|
58
|
-
'West Europe',
|
59
|
-
'Central US',
|
60
|
-
'South Central US',
|
61
|
-
'North Central US',
|
62
|
-
'West Central US',
|
63
|
-
'East US',
|
64
|
-
'East US 2',
|
65
|
-
'West US',
|
66
|
-
'West US 2'
|
64
|
+
['West Europe', 'westeurope'],
|
65
|
+
['Central US', 'centralus'],
|
66
|
+
['South Central US', 'southcentralus'],
|
67
|
+
['North Central US', 'northcentralus'],
|
68
|
+
['West Central US', 'westcentralus'],
|
69
|
+
['East US', 'eastus'],
|
70
|
+
['East US 2', 'eastus2'],
|
71
|
+
['West US', 'westus'],
|
72
|
+
['West US 2', 'westus2']
|
67
73
|
]
|
68
74
|
end
|
69
75
|
|
70
|
-
def storage_accts(region = nil)
|
71
|
-
stripped_region = region.gsub(/\s+/, '').downcase
|
72
|
-
acct_names = []
|
73
|
-
if region.nil?
|
74
|
-
sdk.get_storage_accts.each do |acct|
|
75
|
-
acct_names << acct.name
|
76
|
-
end
|
77
|
-
else
|
78
|
-
(sdk.get_storage_accts.select { |acct| acct.region == stripped_region }).each do |acct|
|
79
|
-
acct_names << acct.name
|
80
|
-
end
|
81
|
-
end
|
82
|
-
acct_names
|
83
|
-
end
|
84
|
-
|
85
76
|
def resource_groups
|
86
77
|
sdk.rgs
|
87
78
|
end
|
@@ -93,25 +84,39 @@ module ForemanAzureRM
|
|
93
84
|
super(options)
|
94
85
|
end
|
95
86
|
|
96
|
-
def new_vm(
|
97
|
-
AzureRMCompute.new(sdk: sdk)
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
87
|
+
def new_vm(args = {})
|
88
|
+
return AzureRMCompute.new(sdk: sdk) if args.empty? || args[:image_id].nil?
|
89
|
+
opts = vm_instance_defaults.merge(args.to_h).deep_symbolize_keys
|
90
|
+
# convert rails nested_attributes into a plain hash
|
91
|
+
nested_args = opts.delete(:interfaces_attributes)
|
92
|
+
opts[:interfaces] = nested_attributes_for(:interfaces, nested_args) if nested_args
|
93
|
+
|
94
|
+
opts.reject! { |k, v| v.nil? }
|
95
|
+
|
96
|
+
raw_vm = initialize_vm(location: region,
|
97
|
+
resource_group: opts[:resource_group],
|
98
|
+
vm_size: opts[:vm_size],
|
99
|
+
username: opts[:username],
|
100
|
+
password: opts[:password],
|
101
|
+
platform: opts[:platform],
|
102
|
+
ssh_key_data: opts[:ssh_key_data],
|
103
|
+
os_disk_caching: opts[:os_disk_caching],
|
104
|
+
vhd_path: opts[:image_id],
|
105
|
+
premium_os_disk: opts[:premium_os_disk]
|
106
|
+
)
|
107
|
+
if opts[:interfaces].present?
|
108
|
+
ifaces = []
|
109
|
+
opts[:interfaces].each_with_index do |iface_attrs, i|
|
110
|
+
ifaces << new_interface(iface_attrs)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
AzureRMCompute.new(azure_vm: raw_vm ,sdk: sdk, resource_group: opts[:resource_group], nics: ifaces)
|
103
114
|
end
|
104
115
|
|
105
116
|
def provided_attributes
|
106
117
|
super.merge({ :ip => :provisioning_ip_address })
|
107
118
|
end
|
108
119
|
|
109
|
-
def host_interfaces_attrs(host)
|
110
|
-
host.interfaces.select(&:physical?).each.with_index.reduce({}) do |hash, (nic, index)|
|
111
|
-
hash.merge(index.to_s => nic.compute_attributes.merge(ip: nic.ip, ip6: nic.ip6))
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
120
|
def available_vnets(attr = {})
|
116
121
|
virtual_networks
|
117
122
|
end
|
@@ -120,22 +125,12 @@ module ForemanAzureRM
|
|
120
125
|
subnets
|
121
126
|
end
|
122
127
|
|
123
|
-
def
|
124
|
-
|
125
|
-
end
|
126
|
-
|
127
|
-
def virtual_networks(region = nil)
|
128
|
-
if region.nil?
|
129
|
-
sdk.vnets
|
130
|
-
else
|
131
|
-
stripped_region = region.gsub(/\s+/, '').downcase
|
132
|
-
sdk.vnets.select { |vnet| vnet.location == stripped_region }
|
133
|
-
end
|
128
|
+
def virtual_networks
|
129
|
+
@virtual_networks ||= sdk.vnets.select { |vnet| vnet.location == region }
|
134
130
|
end
|
135
131
|
|
136
|
-
def subnets
|
137
|
-
|
138
|
-
vnets = virtual_networks(stripped_region)
|
132
|
+
def subnets
|
133
|
+
vnets = virtual_networks
|
139
134
|
subnets = []
|
140
135
|
vnets.each do |vnet|
|
141
136
|
subnets.concat(sdk.subnets(vnet.resource_group, vnet.name))
|
@@ -143,28 +138,46 @@ module ForemanAzureRM
|
|
143
138
|
subnets
|
144
139
|
end
|
145
140
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
141
|
+
alias_method :available_subnets, :subnets
|
142
|
+
|
143
|
+
def new_interface(attrs = {})
|
144
|
+
args = { :network => "", :public_ip => "", :private_ip => false, 'persisted?' => false }.merge(attrs.to_h)
|
145
|
+
OpenStruct.new(args)
|
146
|
+
end
|
147
|
+
|
148
|
+
def editable_network_interfaces?
|
149
|
+
true
|
151
150
|
end
|
152
151
|
|
153
|
-
def vm_sizes
|
152
|
+
def vm_sizes
|
154
153
|
sdk.list_vm_sizes(region)
|
155
154
|
end
|
156
155
|
|
156
|
+
def associated_host(vm)
|
157
|
+
associate_by("ip", [vm.public_ip_address, vm.private_ip_address])
|
158
|
+
end
|
159
|
+
|
157
160
|
def vm_instance_defaults
|
158
|
-
|
161
|
+
super.deep_merge(
|
162
|
+
interfaces: [new_interface]
|
163
|
+
)
|
164
|
+
end
|
165
|
+
|
166
|
+
def vm_nics(vm)
|
167
|
+
ifaces = []
|
168
|
+
vm.network_profile.network_interfaces.each do |nic|
|
169
|
+
nic_rg = (split_nic_id = nic.id.split('/'))[4]
|
170
|
+
nic_name = split_nic_id[-1]
|
171
|
+
ifaces << sdk.vm_nic(nic_rg, nic_name)
|
172
|
+
end
|
173
|
+
ifaces
|
159
174
|
end
|
160
175
|
|
161
|
-
def vms
|
176
|
+
def vms(attrs = {})
|
162
177
|
container = VMContainer.new
|
163
|
-
# Load all vms
|
164
|
-
|
165
|
-
|
166
|
-
container.virtualmachines << AzureRMCompute.new(azure_vm: vm, sdk:sdk)
|
167
|
-
end
|
178
|
+
# Load all vms of the region
|
179
|
+
sdk.list_vms(region).each do |vm|
|
180
|
+
container.virtualmachines << AzureRMCompute.new(azure_vm: vm, sdk:sdk, nics: vm_nics(vm))
|
168
181
|
end
|
169
182
|
container
|
170
183
|
end
|
@@ -188,44 +201,46 @@ module ForemanAzureRM
|
|
188
201
|
end
|
189
202
|
|
190
203
|
def create_vm(args = {})
|
191
|
-
args
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
# as username
|
198
|
-
args[:
|
204
|
+
args = args.to_h.deep_symbolize_keys
|
205
|
+
args[:vm_name] = args[:name].split('.')[0]
|
206
|
+
nics = create_nics(region, args)
|
207
|
+
if args[:password].present? && !args[:ssh_key_data].present?
|
208
|
+
sudoers_cmd = "$echo #{args[:password]} | sudo -S echo '\"#{args[:username]}\" ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/waagent"
|
209
|
+
if args[:script_command].present?
|
210
|
+
# to run the script_cmd given through form as username
|
211
|
+
args[:script_command] = sudoers_cmd + " ; su - \"#{args[:username]}\" -c \"#{args[:script_command]}\""
|
199
212
|
else
|
200
|
-
args[:
|
213
|
+
args[:script_command] = sudoers_cmd
|
201
214
|
end
|
202
215
|
disable_password_auth = false
|
203
|
-
elsif args[:
|
216
|
+
elsif args[:ssh_key_data].present? && !args[:password].present?
|
204
217
|
disable_password_auth = true
|
205
218
|
else
|
206
219
|
disable_password_auth = false
|
207
220
|
end
|
221
|
+
|
208
222
|
vm = create_managed_virtual_machine(
|
209
|
-
name: args[:
|
210
|
-
location:
|
211
|
-
resource_group: args[:
|
212
|
-
vm_size: args[:
|
213
|
-
username: args[:
|
214
|
-
password: args[:
|
215
|
-
ssh_key_data: args[:
|
223
|
+
name: args[:vm_name],
|
224
|
+
location: region,
|
225
|
+
resource_group: args[:resource_group],
|
226
|
+
vm_size: args[:vm_size],
|
227
|
+
username: args[:username],
|
228
|
+
password: args[:password],
|
229
|
+
ssh_key_data: args[:ssh_key_data],
|
216
230
|
disable_password_authentication: disable_password_auth,
|
217
231
|
network_interface_card_ids: nics.map(&:id),
|
218
|
-
platform: args[:
|
232
|
+
platform: args[:platform],
|
219
233
|
vhd_path: args[:image_id],
|
220
|
-
os_disk_caching: args[:
|
221
|
-
premium_os_disk: args[:
|
234
|
+
os_disk_caching: args[:os_disk_caching],
|
235
|
+
premium_os_disk: args[:premium_os_disk],
|
222
236
|
custom_data: args[:user_data],
|
223
|
-
script_command: args[:
|
224
|
-
script_uris: args[:
|
237
|
+
script_command: args[:script_command],
|
238
|
+
script_uris: args[:script_uris],
|
225
239
|
)
|
226
|
-
|
240
|
+
logger.debug "Virtual Machine #{args[:vm_name]} Created Successfully."
|
241
|
+
create_vm_extension(region, args)
|
227
242
|
# return the vm object using azure_vm
|
228
|
-
|
243
|
+
AzureRMCompute.new(azure_vm: vm, sdk: sdk, resource_group: args[:resource_group], nics: vm_nics(vm))
|
229
244
|
rescue RuntimeError => e
|
230
245
|
Foreman::Logging.exception('Unhandled Azure RM error', e)
|
231
246
|
destroy_vm vm.id if vm
|
@@ -233,15 +248,13 @@ module ForemanAzureRM
|
|
233
248
|
end
|
234
249
|
|
235
250
|
def destroy_vm(uuid)
|
236
|
-
#vm.azure_vm because that's the azure object and vm is the wrapper
|
237
251
|
vm = find_vm_by_uuid(uuid)
|
238
|
-
|
239
|
-
rg_name = vm.azure_vm.resource_group
|
252
|
+
rg_name = vm.resource_group
|
240
253
|
os_disk = vm.azure_vm.storage_profile.os_disk
|
241
254
|
data_disks = vm.azure_vm.storage_profile.data_disks
|
242
255
|
nic_ids = vm.network_interface_card_ids
|
243
256
|
|
244
|
-
sdk.delete_vm(rg_name,
|
257
|
+
sdk.delete_vm(rg_name, vm.name)
|
245
258
|
|
246
259
|
nic_ids.each do |nic_id|
|
247
260
|
nic = sdk.vm_nic(rg_name, nic_id.split('/')[-1])
|
@@ -2,12 +2,29 @@ module ForemanAzureRM
|
|
2
2
|
class AzureRMCompute
|
3
3
|
attr_accessor :sdk
|
4
4
|
attr_accessor :azure_vm
|
5
|
+
attr_accessor :resource_group
|
6
|
+
attr_accessor :nics
|
7
|
+
attr_accessor :image_id
|
5
8
|
|
6
9
|
delegate :name, to: :azure_vm, allow_nil: true
|
7
10
|
|
8
|
-
def initialize(azure_vm: ComputeModels::VirtualMachine.new,
|
11
|
+
def initialize(azure_vm: ComputeModels::VirtualMachine.new,
|
12
|
+
sdk: sdk,
|
13
|
+
resource_group: azure_vm.resource_group,
|
14
|
+
nics: [])
|
15
|
+
|
9
16
|
@azure_vm = azure_vm
|
10
17
|
@sdk = sdk
|
18
|
+
@resource_group ||= resource_group
|
19
|
+
@nics ||= nics
|
20
|
+
@azure_vm.hardware_profile ||= ComputeModels::HardwareProfile.new
|
21
|
+
@azure_vm.os_profile ||= ComputeModels::OSProfile.new
|
22
|
+
@azure_vm.os_profile.linux_configuration ||= ComputeModels::LinuxConfiguration.new
|
23
|
+
@azure_vm.os_profile.linux_configuration.ssh ||= ComputeModels::SshConfiguration.new
|
24
|
+
@azure_vm.os_profile.linux_configuration.ssh.public_keys ||= [ComputeModels::SshPublicKey.new]
|
25
|
+
@azure_vm.storage_profile ||= ComputeModels::StorageProfile.new
|
26
|
+
@azure_vm.storage_profile.os_disk ||= ComputeModels::OSDisk.new
|
27
|
+
@azure_vm.storage_profile.os_disk.managed_disk ||= ComputeModels::ManagedDiskParameters.new
|
11
28
|
end
|
12
29
|
|
13
30
|
def id
|
@@ -18,10 +35,6 @@ module ForemanAzureRM
|
|
18
35
|
!!identity && !!id
|
19
36
|
end
|
20
37
|
|
21
|
-
def vm_size
|
22
|
-
@azure_vm.hardware_profile.vm_size
|
23
|
-
end
|
24
|
-
|
25
38
|
def wait_for(_timeout = 0, _interval = 0, &block)
|
26
39
|
instance_eval(&block)
|
27
40
|
return true
|
@@ -35,46 +48,60 @@ module ForemanAzureRM
|
|
35
48
|
vm_status
|
36
49
|
end
|
37
50
|
|
51
|
+
def start
|
52
|
+
sdk.start_vm(@azure_vm.resource_group, name)
|
53
|
+
true
|
54
|
+
end
|
55
|
+
|
56
|
+
def stop
|
57
|
+
sdk.stop_vm(@azure_vm.resource_group, name)
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
38
61
|
def vm_status
|
39
62
|
sdk.check_vm_status(@azure_vm.resource_group, name)
|
40
63
|
end
|
41
64
|
|
42
65
|
def network_interface_card_ids
|
66
|
+
return nil unless @azure_vm.network_profile
|
43
67
|
nics = @azure_vm.network_profile.network_interfaces
|
44
68
|
nics.map(&:id)
|
45
69
|
end
|
46
70
|
|
47
71
|
def provisioning_ip_address
|
72
|
+
public_ip_address || private_ip_address
|
73
|
+
end
|
74
|
+
|
75
|
+
def public_ip_address
|
48
76
|
interfaces.each do |nic|
|
49
77
|
nic.ip_configurations.each do |configuration|
|
50
78
|
next unless configuration.primary
|
51
|
-
if configuration.public_ipaddress.
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
else
|
58
|
-
return configuration.private_ipaddress
|
59
|
-
end
|
79
|
+
return nil if configuration.public_ipaddress.blank?
|
80
|
+
ip_id = configuration.public_ipaddress.id
|
81
|
+
ip_rg = ip_id.split('/')[4]
|
82
|
+
ip_name = ip_id.split('/')[-1]
|
83
|
+
public_ip = sdk.public_ip(ip_rg, ip_name)
|
84
|
+
return public_ip.ip_address
|
60
85
|
end
|
61
|
-
end
|
86
|
+
end
|
62
87
|
end
|
63
88
|
|
64
|
-
def
|
65
|
-
interfaces
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
89
|
+
def private_ip_address
|
90
|
+
interfaces.each do |nic|
|
91
|
+
nic.ip_configurations.each do |configuration|
|
92
|
+
next unless configuration.primary
|
93
|
+
if configuration.private_ipaddress.present?
|
94
|
+
return private_ip_address = configuration.private_ipaddress
|
95
|
+
end
|
71
96
|
end
|
72
97
|
end
|
73
|
-
interfaces
|
74
98
|
end
|
75
99
|
|
76
|
-
def interfaces
|
77
|
-
|
100
|
+
def interfaces
|
101
|
+
nics
|
102
|
+
end
|
103
|
+
|
104
|
+
def interfaces_attributes=(attrs)
|
78
105
|
end
|
79
106
|
|
80
107
|
def ip_addresses
|
@@ -89,7 +116,45 @@ module ForemanAzureRM
|
|
89
116
|
@azure_vm.name = setuuid
|
90
117
|
end
|
91
118
|
|
92
|
-
|
119
|
+
# Following properties are for AzureRM
|
120
|
+
# These are not part of Foreman's interface
|
121
|
+
|
122
|
+
def vm_size
|
123
|
+
@azure_vm.hardware_profile.vm_size
|
124
|
+
end
|
125
|
+
|
126
|
+
def platform
|
127
|
+
@azure_vm.storage_profile.os_disk.os_type
|
128
|
+
end
|
129
|
+
|
130
|
+
def username
|
131
|
+
@azure_vm.os_profile.admin_username
|
132
|
+
end
|
133
|
+
|
134
|
+
def password
|
135
|
+
@azure_vm.os_profile.admin_password
|
136
|
+
end
|
137
|
+
|
138
|
+
def ssh_key_data
|
139
|
+
# since you can only give one additional
|
140
|
+
# sshkey through foreman's UI
|
141
|
+
sshkey = @azure_vm.os_profile.linux_configuration.ssh.public_keys[1]
|
142
|
+
return unless sshkey.present?
|
143
|
+
sshkey.key_data
|
144
|
+
end
|
145
|
+
|
146
|
+
def premium_os_disk
|
147
|
+
@azure_vm.storage_profile.os_disk.managed_disk.storage_account_type
|
148
|
+
end
|
149
|
+
|
150
|
+
def os_disk_caching
|
151
|
+
@azure_vm.storage_profile.os_disk.caching
|
152
|
+
end
|
153
|
+
|
154
|
+
def script_command
|
155
|
+
end
|
156
|
+
|
157
|
+
def script_uris
|
93
158
|
end
|
94
159
|
end
|
95
160
|
end
|
@@ -1 +1 @@
|
|
1
|
-
attributes :
|
1
|
+
attributes :tenant, :app_ident, :sub_id, :secret_key, :region
|
@@ -1,8 +1,10 @@
|
|
1
|
-
<%= text_f f, :
|
1
|
+
<%= text_f f, :app_ident, :label => _('Client ID'), :required => true %>
|
2
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
4
|
<%= text_f f, :uuid, :label => _('Tenant ID'), :required => true %>
|
5
5
|
|
6
|
+
<%= selectable_f(f, :url, f.object.regions, {}, {:label => _('Azure Region'), :required => true }) %>
|
7
|
+
|
6
8
|
<div class="col-md-offset-2">
|
7
9
|
<%= test_connection_button_f(f, true) %>
|
8
10
|
</div>
|
@@ -2,16 +2,17 @@
|
|
2
2
|
os ||= nil
|
3
3
|
images = possible_images(compute_resource, arch, os)
|
4
4
|
resource_groups = compute_resource.resource_groups
|
5
|
+
compute_resource_id = compute_resource.id
|
5
6
|
%>
|
6
7
|
|
7
|
-
<script>
|
8
|
+
<script >
|
8
9
|
function azure_rm_region_callback() {
|
9
10
|
azure_rm_get_size_from_region();
|
10
11
|
azure_rm_subnets_from_region();
|
11
12
|
}
|
12
13
|
|
13
14
|
function azure_rm_get_size_from_region() {
|
14
|
-
var
|
15
|
+
var compute_resource = <%=compute_resource_id%>;
|
15
16
|
var size_spinner = $('#azure_rm_size_spinner');
|
16
17
|
var sizes = $('#azure_rm_size');
|
17
18
|
var imageId = $('#azure_rm_image_id').val();
|
@@ -22,7 +23,7 @@
|
|
22
23
|
}
|
23
24
|
size_spinner.removeClass('hide');
|
24
25
|
$.ajax({
|
25
|
-
data: {"
|
26
|
+
data: {"image_id": imageId, "compute_resource_id": compute_resource},
|
26
27
|
type: 'get',
|
27
28
|
url: '/azure_rm/sizes',
|
28
29
|
complete: function () {
|
@@ -50,14 +51,14 @@
|
|
50
51
|
function azure_rm_subnets_from_region() {
|
51
52
|
var imageId = $('#azure_rm_image_id').val();
|
52
53
|
var subnets = $('#azure_rm_subnet');
|
53
|
-
var
|
54
|
+
var compute_resource = <%=compute_resource_id%>;
|
54
55
|
if (typeof tfm == 'undefined') { // earlier than 1.13
|
55
56
|
foreman.tools.showSpinner();
|
56
57
|
} else {
|
57
58
|
tfm.tools.showSpinner();
|
58
59
|
}
|
59
60
|
$.ajax({
|
60
|
-
data: {"image_id": imageId, "
|
61
|
+
data: {"image_id": imageId, "compute_resource_id": compute_resource},
|
61
62
|
type: 'get',
|
62
63
|
url: '/azure_rm/subnets',
|
63
64
|
complete: function () {
|
@@ -84,109 +85,102 @@
|
|
84
85
|
}
|
85
86
|
</script>
|
86
87
|
|
87
|
-
<% #This view has been modified and
|
88
|
-
|
88
|
+
<% # This view has been modified and refers to the properties wrapper class %>
|
89
|
+
|
90
|
+
<%= selectable_f f, :resource_group, resource_groups,
|
91
|
+
{ :include_blank => true },
|
92
|
+
{
|
93
|
+
:disabled => resource_groups.empty?,
|
94
|
+
:label => _('Resource Group'),
|
95
|
+
:required => true,
|
96
|
+
:id => 'azure_rm_rg',
|
97
|
+
:help_inline => spinner_button_f(f, _('Reload Images, Sizes, vNets'),
|
98
|
+
'azure_rm_region_callback();',
|
99
|
+
{
|
100
|
+
:id => 'load_subnets_btn',
|
101
|
+
:spinner_id => 'load_subnets_indicator',
|
102
|
+
:class => 'btn-success',
|
103
|
+
:spinner_class => 'spinner-inverse'
|
104
|
+
})
|
105
|
+
}
|
89
106
|
%>
|
90
107
|
|
91
|
-
<%= f
|
108
|
+
<%= selectable_f f, :vm_size, compute_resource.vm_sizes.map { |size| size.name },
|
109
|
+
{},
|
110
|
+
{
|
111
|
+
:label => _('VM Size'),
|
112
|
+
:required => true,
|
113
|
+
:id => 'azure_rm_size'
|
114
|
+
}
|
115
|
+
%>
|
92
116
|
|
93
|
-
|
94
|
-
{
|
117
|
+
<%= selectable_f f, :platform, %w(Linux Windows),
|
118
|
+
{},
|
95
119
|
{
|
96
|
-
:label
|
97
|
-
:required
|
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
|
-
})
|
120
|
+
:label => _('Platform'),
|
121
|
+
:required => true
|
109
122
|
}
|
110
|
-
|
123
|
+
%>
|
111
124
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
:id => 'azure_rm_rg'
|
119
|
-
}
|
120
|
-
%>
|
125
|
+
<%= text_f f, :username,
|
126
|
+
{
|
127
|
+
:label => _('Username'),
|
128
|
+
:required => true
|
129
|
+
}
|
130
|
+
%>
|
121
131
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
}
|
129
|
-
%>
|
132
|
+
<%= password_f f, :password,
|
133
|
+
{
|
134
|
+
:label => _('Password'),
|
135
|
+
:required => true,
|
136
|
+
:placeholder => "********",
|
137
|
+
:value => f.object.password
|
130
138
|
|
131
|
-
|
132
|
-
|
133
|
-
{
|
134
|
-
:label => _('Platform'),
|
135
|
-
:required => true
|
136
|
-
}
|
137
|
-
%>
|
139
|
+
}
|
140
|
+
%>
|
138
141
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
%>
|
142
|
+
<%= textarea_f f, :ssh_key_data,
|
143
|
+
{
|
144
|
+
:label => _('SSH Key')
|
145
|
+
}
|
146
|
+
%>
|
145
147
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
148
|
+
<%= checkbox_f f, :premium_os_disk,
|
149
|
+
{ :checked => f.object.premium_os_disk == "Premium_LRS",
|
150
|
+
:label => _('Premium OS Disk'),
|
151
|
+
:label_size => "col-md-2"
|
152
|
+
},
|
153
|
+
'true',
|
154
|
+
'false'
|
155
|
+
%>
|
153
156
|
|
154
|
-
|
157
|
+
<%= selectable_f f, :os_disk_caching, %w(None ReadOnly ReadWrite),
|
158
|
+
{},
|
155
159
|
{
|
156
|
-
:label
|
160
|
+
:label => _('OS Disk Caching'),
|
161
|
+
:required => true,
|
162
|
+
:class => "col-md-2"
|
157
163
|
}
|
158
|
-
|
164
|
+
%>
|
159
165
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
%>
|
166
|
+
<%= text_f f, :script_command,
|
167
|
+
{
|
168
|
+
:label => _('Custom Script Command'),
|
169
|
+
:help_inline => _("To perform commands as root, prefix it with 'sudo'.")
|
170
|
+
}
|
171
|
+
%>
|
167
172
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
:class => "col-md-2"
|
174
|
-
}
|
175
|
-
%>
|
173
|
+
<%= text_f f, :script_uris,
|
174
|
+
{
|
175
|
+
:label => _('Comma seperated file URIs')
|
176
|
+
}
|
177
|
+
%>
|
176
178
|
|
177
|
-
|
178
|
-
|
179
|
-
:label => _('Custom Script Command'),
|
180
|
-
:help_inline => _("To perform commands as root, prefix it with 'sudo'.")
|
181
|
-
}
|
182
|
-
%>
|
179
|
+
<% checked = params[:host] && params[:host][:compute_attributes] && params[:host][:compute_attributes][:start] || '1'
|
180
|
+
%>
|
183
181
|
|
184
|
-
|
185
|
-
|
186
|
-
:label => _('Comma seperated file URIs')
|
187
|
-
}
|
188
|
-
%>
|
189
|
-
<% end %>
|
182
|
+
<%= checkbox_f f, :start, { :checked => (checked == '1'), :help_inline => _("Power ON this machine upon creation"), :label => _('Start'), :label_size => "col-md-2" } if new_vm && controller_name != "compute_attributes"
|
183
|
+
%>
|
190
184
|
|
191
185
|
<div id="image_selection">
|
192
186
|
<%= select_f f, :image_id, images, :uuid, :name,
|
@@ -1,5 +1,8 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<% nat = compute_resource.subnets.collect { |s| [ "#{s.id.split('/')[8]}-#{s.name} #{s.address_prefix}", s.id ] } %>
|
2
|
+
|
3
|
+
<%= selectable_f f, :network, options_for_select(nat,
|
4
|
+
:selected => f.object.network),
|
5
|
+
{ :include_blank => _('Select') },
|
3
6
|
{
|
4
7
|
:label => _('Azure Subnet'),
|
5
8
|
:required => true,
|
@@ -8,16 +11,21 @@
|
|
8
11
|
}
|
9
12
|
%>
|
10
13
|
|
11
|
-
<%= selectable_f f, :
|
14
|
+
<%= selectable_f f, :public_ip, options_for_select(['None', 'Dynamic', 'Static'],
|
15
|
+
:selected => f.object.public_ip),
|
12
16
|
{},
|
13
17
|
{
|
14
|
-
|
15
|
-
|
18
|
+
:label => _("Public IP"),
|
19
|
+
:label_size => "col-md-2"
|
16
20
|
}
|
17
21
|
%>
|
18
22
|
|
19
|
-
<%= checkbox_f f, :
|
20
|
-
{
|
21
|
-
|
22
|
-
|
23
|
-
|
23
|
+
<%= checkbox_f f, :private_ip,
|
24
|
+
{
|
25
|
+
:label => _("Static Private IP"),
|
26
|
+
:label_size => "col-md-2"
|
27
|
+
},
|
28
|
+
'true',
|
29
|
+
'false'
|
30
|
+
|
31
|
+
%>
|
@@ -6,14 +6,14 @@
|
|
6
6
|
<th><%= _('Resource Group') %></th>
|
7
7
|
<th><%= _('Region') %></th>
|
8
8
|
<th><%= _('State') %></th>
|
9
|
-
<th
|
9
|
+
<th><%= _('Actions') %></th>
|
10
10
|
</tr>
|
11
11
|
</thead>
|
12
12
|
<% @vms.each do |vm| %>
|
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.
|
16
|
+
<td><%= vm.resource_group %></td>
|
17
17
|
<td><%= vm.azure_vm.location %></td>
|
18
18
|
<td> <span <%= vm_power_class(vm.ready?) %>> <%= vm_state(vm) %> </span> </td>
|
19
19
|
<td>
|
@@ -2,5 +2,5 @@
|
|
2
2
|
:help_inline => _("The user that will be used to SSH into the VM for completion")
|
3
3
|
%>
|
4
4
|
<%= password_f f, :password, :help_inline => _("Password to authenticate with - used for SSH finish step.") %>
|
5
|
-
<%= image_field(f, :label => _("
|
5
|
+
<%= image_field(f, :label => _("Marketplace Image URN"), :help_inline => _("Marketplace URN (e.g. OpenLogic:CentOS:7.5:latest)")) %>
|
6
6
|
<%= checkbox_f f, :user_data, :help_inline => _("Does this image support user data input?") %>
|
data/lib/foreman_azure_rm.rb
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
require 'foreman_azure_rm/engine.rb'
|
2
|
+
require 'azure_mgmt_resources'
|
3
|
+
require 'azure_mgmt_network'
|
4
|
+
require 'azure_mgmt_storage'
|
5
|
+
require 'azure_mgmt_compute'
|
2
6
|
|
3
7
|
module ForemanAzureRM
|
8
|
+
Storage = Azure::Storage::Profiles::Latest::Mgmt
|
9
|
+
Network = Azure::Network::Profiles::Latest::Mgmt
|
10
|
+
Compute = Azure::Compute::Profiles::Latest::Mgmt
|
11
|
+
Resources = Azure::Resources::Profiles::Latest::Mgmt
|
4
12
|
|
13
|
+
StorageModels = Storage::Models
|
14
|
+
NetworkModels = Network::Models
|
15
|
+
ComputeModels = Compute::Models
|
16
|
+
ResourceModels = Resources::Models
|
5
17
|
end
|
@@ -1,14 +1,4 @@
|
|
1
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
2
|
class AzureSDKAdapter
|
13
3
|
def initialize(tenant, app_ident, secret_key, sub_id)
|
14
4
|
@tenant = tenant
|
@@ -56,8 +46,8 @@ module ForemanAzureRM
|
|
56
46
|
network_client.virtual_networks.list_all
|
57
47
|
end
|
58
48
|
|
59
|
-
def subnets(
|
60
|
-
network_client.subnets.list(
|
49
|
+
def subnets(rg_name, vnet_name)
|
50
|
+
network_client.subnets.list(rg_name, vnet_name)
|
61
51
|
end
|
62
52
|
|
63
53
|
def public_ip(rg_name, pip_name)
|
@@ -68,14 +58,19 @@ module ForemanAzureRM
|
|
68
58
|
network_client.network_interfaces.get(rg_name, nic_name)
|
69
59
|
end
|
70
60
|
|
61
|
+
def get_vm_extension(rg_name, vm_name, vm_extension_name)
|
62
|
+
compute_client.virtual_machine_extensions.get(rg_name, vm_name, vm_extension_name)
|
63
|
+
end
|
64
|
+
|
71
65
|
def list_vm_sizes(region)
|
66
|
+
return [] unless region.present?
|
72
67
|
stripped_region = region.gsub(/\s+/, '').downcase
|
73
68
|
compute_client.virtual_machine_sizes.list(stripped_region).value()
|
74
69
|
end
|
75
70
|
|
76
|
-
def list_vms(
|
71
|
+
def list_vms(region)
|
77
72
|
# List all VMs in a resource group
|
78
|
-
virtual_machines = compute_client.virtual_machines.
|
73
|
+
virtual_machines = compute_client.virtual_machines.list_by_location(region)
|
79
74
|
end
|
80
75
|
|
81
76
|
def get_vm(rg_name, vm_name)
|
@@ -137,5 +132,14 @@ module ForemanAzureRM
|
|
137
132
|
end
|
138
133
|
vm_status
|
139
134
|
end
|
135
|
+
|
136
|
+
def start_vm(rg_name, vm_name)
|
137
|
+
compute_client.virtual_machines.start(rg_name, vm_name)
|
138
|
+
end
|
139
|
+
|
140
|
+
def stop_vm(rg_name, vm_name)
|
141
|
+
compute_client.virtual_machines.power_off(rg_name, vm_name)
|
142
|
+
compute_client.virtual_machines.deallocate(rg_name, vm_name)
|
143
|
+
end
|
140
144
|
end
|
141
145
|
end
|
@@ -4,13 +4,19 @@ module ForemanAzureRM
|
|
4
4
|
|
5
5
|
#autoloading all files inside lib dir
|
6
6
|
config.autoload_paths += Dir["#{config.root}/lib"]
|
7
|
-
config.autoload_paths += Dir["#{config.root}/app/models/concerns"]
|
7
|
+
config.autoload_paths += Dir["#{config.root}/app/models/concerns/foreman_azure_rm/vm_extensions/"]
|
8
8
|
|
9
9
|
initializer 'foreman_azure_rm.register_plugin', :before => :finisher_hook do
|
10
10
|
Foreman::Plugin.register :foreman_azure_rm do
|
11
11
|
requires_foreman '>= 1.17'
|
12
12
|
compute_resource ForemanAzureRM::AzureRM
|
13
|
-
parameter_filter ComputeResource, :azure_vm, :tenant, :app_ident, :secret_key, :sub_id
|
13
|
+
parameter_filter ComputeResource, :azure_vm, :tenant, :app_ident, :secret_key, :sub_id, :region
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
initializer "foreman_azure_rm.add_rabl_view_path" do
|
18
|
+
Rabl.configure do |config|
|
19
|
+
config.view_paths << ForemanAzureRM::Engine.root.join('app', 'views')
|
14
20
|
end
|
15
21
|
end
|
16
22
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_azure_rm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aditi Puntambekar
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-
|
13
|
+
date: 2019-10-31 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: deface
|
@@ -169,9 +169,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
169
169
|
version: '0'
|
170
170
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
171
|
requirements:
|
172
|
-
- - "
|
172
|
+
- - ">="
|
173
173
|
- !ruby/object:Gem::Version
|
174
|
-
version:
|
174
|
+
version: '0'
|
175
175
|
requirements: []
|
176
176
|
rubyforge_project:
|
177
177
|
rubygems_version: 2.7.6
|