foreman_azure_rm 2.0.7 → 2.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/azure_compute_resource_helper.rb +17 -0
  3. data/app/models/concerns/foreman_azure_rm/vm_extensions/managed_vm.rb +50 -28
  4. data/app/models/foreman_azure_rm/azure_rm.rb +86 -71
  5. data/app/models/foreman_azure_rm/azure_rm_compute.rb +34 -3
  6. data/app/views/compute_resources/form/_azurerm.html.erb +3 -6
  7. data/app/views/compute_resources_vms/form/azurerm/_base.html.erb +1 -1
  8. data/app/views/compute_resources_vms/form/azurerm/_volume.html.erb +20 -0
  9. data/app/views/images/form/_azurerm.html.erb +1 -1
  10. data/db/migrate/20200507103900_fix_image_uuid_prefix.rb +8 -0
  11. data/lib/foreman_azure_rm.rb +3 -0
  12. data/lib/foreman_azure_rm/azure_sdk_adapter.rb +68 -2
  13. data/lib/foreman_azure_rm/engine.rb +6 -0
  14. data/lib/foreman_azure_rm/version.rb +1 -1
  15. data/locale/Makefile +61 -0
  16. data/locale/action_names.rb +5 -0
  17. data/locale/ca/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  18. data/locale/ca/foreman_azure_rm.po +185 -0
  19. data/locale/cs_CZ/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  20. data/locale/cs_CZ/foreman_azure_rm.po +189 -0
  21. data/locale/de/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  22. data/locale/de/foreman_azure_rm.po +191 -0
  23. data/locale/en/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  24. data/locale/en/foreman_azure_rm.po +183 -0
  25. data/locale/en_GB/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  26. data/locale/en_GB/foreman_azure_rm.po +187 -0
  27. data/locale/es/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  28. data/locale/es/foreman_azure_rm.po +190 -0
  29. data/locale/foreman_azure_rm.pot +248 -0
  30. data/locale/fr/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  31. data/locale/fr/foreman_azure_rm.po +187 -0
  32. data/locale/gl/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  33. data/locale/gl/foreman_azure_rm.po +185 -0
  34. data/locale/it/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  35. data/locale/it/foreman_azure_rm.po +187 -0
  36. data/locale/ja/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  37. data/locale/ja/foreman_azure_rm.po +187 -0
  38. data/locale/ko/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  39. data/locale/ko/foreman_azure_rm.po +186 -0
  40. data/locale/nl_NL/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  41. data/locale/nl_NL/foreman_azure_rm.po +187 -0
  42. data/locale/pl/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  43. data/locale/pl/foreman_azure_rm.po +188 -0
  44. data/locale/pt_BR/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  45. data/locale/pt_BR/foreman_azure_rm.po +190 -0
  46. data/locale/ru/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  47. data/locale/ru/foreman_azure_rm.po +190 -0
  48. data/locale/sv_SE/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  49. data/locale/sv_SE/foreman_azure_rm.po +187 -0
  50. data/locale/zh_CN/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  51. data/locale/zh_CN/foreman_azure_rm.po +188 -0
  52. data/locale/zh_TW/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  53. data/locale/zh_TW/foreman_azure_rm.po +187 -0
  54. metadata +59 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6b3d52bb180b583d6d307ef39a00efea028a52cb783d0f5dcfb1635e9e73c74
4
- data.tar.gz: db51091159e0eb00bcf3bfe3c13d6eee7c66e4db53e49200988717ac352ad0aa
3
+ metadata.gz: 56702d3d39f9bc9753e04e4681b4607d073cc913c1625835dda252a8a575cb6a
4
+ data.tar.gz: 59999cc6458945958f13933a0a9c1b08b63d8ddad0cb6ece337b86e367948190
5
5
  SHA512:
6
- metadata.gz: 0203261bd33988e9f453e8247bef50fff3c7ece7e265e7928f20c27b9c147c5f7207431056d4b5549bcfc6951456e2819e9b0d5c724eec0ee950ed09d0d64e63
7
- data.tar.gz: d4a34c46a09a35b9e0bcb42df77ef24d9f6a99ce3216e72c736ffb782f18c036f523d8a0ccdaf2df009519a30aa5d54a330a5b57397aa87edb1e8a461a09549a
6
+ metadata.gz: beb3b60d5c7790ff3063c67634d749fa5ca13148bde4197e40f0d5014ec3bdab94956688b5a6de21fa13ee40e0edf76bccd7ce2fa6e1ebcd6be7fafb9f79057a
7
+ data.tar.gz: c4e0e9857dfe71bc31d09275c012ed263dde09e25d98ea5d32c75a8be812f8a325a0d5f2e9880f6a84109c9f8a6f2ff3ee5db0e1079b969c27102cd84fc2d54e
@@ -0,0 +1,17 @@
1
+ module AzureComputeResourceHelper
2
+ def regions_list(azurerm_cr, f)
3
+ begin
4
+ regions = azurerm_cr.regions || []
5
+ rescue StandardError
6
+ #do nothing
7
+ regions = []
8
+ rescue Exception => ex
9
+ return information_box("Regions could not be loaded due to exception: #{ex}")
10
+ end
11
+ selectable_f(f, :url, regions, {}, {:label => _('Azure Region'), :disabled => regions.empty?, :required => true, :help_inline_permanent => load_button_f(f, regions.present?, _("Load Regions")) })
12
+ end
13
+ def azure_doc_url
14
+ doc_version = Foreman::Plugin.find(:foreman_azure_rm).version.scan(/\d+\.\d+/).first + '.x'
15
+ "https://theforeman.org/plugins/foreman_azure/#{doc_version}"
16
+ end
17
+ end
@@ -13,19 +13,7 @@ module ForemanAzureRm
13
13
  os_disk.name = "#{vm_name}-osdisk"
14
14
  os_disk.os_type = platform
15
15
  os_disk.create_option = ComputeModels::DiskCreateOptionTypes::FromImage
16
- os_disk.caching = if os_disk_caching.present?
17
- case os_disk_caching
18
- when 'None'
19
- ComputeModels::CachingTypes::None
20
- when 'ReadOnly'
21
- ComputeModels::CachingTypes::ReadOnly
22
- when 'ReadWrite'
23
- ComputeModels::CachingTypes::ReadWrite
24
- end
25
- else
26
- # ARM best practices stipulate RW caching on the OS disk
27
- ComputeModels::CachingTypes::ReadWrite
28
- end
16
+ os_disk.caching = disk_caching(os_disk_caching)
29
17
  managed_disk_params.storage_account_type = if premium_os_disk == 'true'
30
18
  ComputeModels::StorageAccountTypes::PremiumLRS
31
19
  else
@@ -33,10 +21,44 @@ module ForemanAzureRm
33
21
  end
34
22
  os_disk.managed_disk = managed_disk_params
35
23
  storage_profile.os_disk = os_disk
36
-
37
24
  storage_profile
38
25
  end
39
26
 
27
+ def disk_caching(disk_type_caching)
28
+ case disk_type_caching
29
+ when 'None'
30
+ ComputeModels::CachingTypes::None
31
+ when 'ReadOnly'
32
+ ComputeModels::CachingTypes::ReadOnly
33
+ when 'ReadWrite'
34
+ ComputeModels::CachingTypes::ReadWrite
35
+ when nil, ""
36
+ nil
37
+ else
38
+ raise RuntimeError, "Disk caching value must be either 'None', 'ReadOnly' or 'ReadWrite'."
39
+ end
40
+ end
41
+
42
+ def define_data_disks(vm_name, data_disks)
43
+ unless data_disks.nil?
44
+ disks = []
45
+ disk_count = 0
46
+ data_disks.each do |disk_num, attrs|
47
+ managed_data_disk = ComputeModels::ManagedDiskParameters.new
48
+ disk = ComputeModels::DataDisk.new
49
+ disk.name = "#{vm_name}-data-disk#{disk_count}"
50
+ disk.caching = disk_caching(attrs[:data_disk_caching])
51
+ disk.disk_size_gb = attrs[:disk_size_gb]
52
+ disk.create_option = ComputeModels::DiskCreateOption::Empty
53
+ disk.lun = disk_count + 1
54
+ disk.managed_disk = managed_data_disk
55
+ disk_count += 1
56
+ disks << disk
57
+ end
58
+ disks
59
+ end
60
+ end
61
+
40
62
  def marketplace_image_reference(publisher, offer, sku, version)
41
63
  image_reference = ComputeModels::ImageReference.new
42
64
  image_reference.publisher = publisher
@@ -46,26 +68,25 @@ module ForemanAzureRm
46
68
  image_reference
47
69
  end
48
70
 
49
- def define_image(image_id)
50
- # If image UUID begins with / it is a custom managed image
51
- # Otherwise it is a marketplace URN
52
- unless image_id.start_with?('/')
71
+ def define_image(rg_name, image)
72
+ image_type, image_id = image.split('://')
73
+ case image_type
74
+ when 'marketplace'
53
75
  urn = image_id.split(':')
54
76
  publisher = urn[0]
55
77
  offer = urn[1]
56
78
  sku = urn[2]
57
79
  version = urn[3]
58
- image_id = nil
59
- end
60
-
61
- if image_id.nil?
62
- # For marketplace image
63
80
  image_reference = marketplace_image_reference(publisher, offer, sku, version)
81
+ when 'custom'
82
+ custom_image = sdk.get_custom_image(rg_name, image_id)
83
+ image_reference = ComputeModels::ImageReference.new
84
+ image_reference.id = custom_image.id
85
+ when 'gallery'
86
+ image_reference = ComputeModels::ImageReference.new
87
+ image_reference.id = sdk.fetch_gallery_image_id(rg_name, image_id)
64
88
  else
65
- # For custom managed image
66
- image_ref = ComputeModels::ImageReference.new
67
- image_ref.id = image_id
68
- image_reference = image_ref
89
+ image_reference = nil
69
90
  end
70
91
  image_reference
71
92
  end
@@ -189,7 +210,8 @@ module ForemanAzureRm
189
210
  def create_managed_virtual_machine(vm_hash)
190
211
  vm_params = initialize_vm(vm_hash)
191
212
  vm_params.network_profile = define_network_profile(vm_hash[:network_interface_card_ids])
192
- vm_params.storage_profile.image_reference = define_image(vm_hash[:image_id])
213
+ vm_params.storage_profile.image_reference = define_image(vm_hash[:resource_group], vm_hash[:image_id])
214
+ vm_params.storage_profile.data_disks = define_data_disks(vm_hash[:name], vm_hash[:data_disks])
193
215
  sdk.create_or_update_vm(vm_hash[:resource_group], vm_hash[:name], vm_params)
194
216
  end
195
217
 
@@ -12,12 +12,14 @@ module ForemanAzureRm
12
12
  alias_attribute :region, :url
13
13
  alias_attribute :tenant, :uuid
14
14
 
15
- validates :user, :password, :url, :uuid, :app_ident, :presence => true
15
+ validates :user, :password, :uuid, :app_ident, :presence => true
16
16
 
17
17
  has_one :key_pair, :foreign_key => :compute_resource_id, :dependent => :destroy
18
18
 
19
19
  before_create :test_connection, :setup_key_pair
20
20
 
21
+ validate :ensure_attributes_and_values
22
+
21
23
  class VMContainer
22
24
  attr_accessor :virtualmachines
23
25
  delegate :each, to: :virtualmachines
@@ -47,6 +49,15 @@ module ForemanAzureRm
47
49
  "#{name} (#{provider_friendly_name})"
48
50
  end
49
51
 
52
+ def ensure_attributes_and_values
53
+ validate_region
54
+ end
55
+
56
+ def validate_region
57
+ return unless regions.present?
58
+ errors.add(:region, "is not valid, must be lowercase eg. 'eastus'. No special characters allowed.") unless regions.collect(&:second).include?(region)
59
+ end
60
+
50
61
  def self.model_name
51
62
  ComputeResource.model_name
52
63
  end
@@ -56,81 +67,35 @@ module ForemanAzureRm
56
67
  end
57
68
 
58
69
  def capabilities
59
- [:image]
60
- end
61
-
62
- def self.regions
63
- [
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'],
73
- ['Canada Central', 'canadacentral'],
74
- ['Canada East', 'canadaeast'],
75
- ['Brazil South', 'brazilsouth'],
76
- ['North Europe', 'northeurope'],
77
- ['France Central', 'francecentral'],
78
- ['France South', 'francesouth'],
79
- ['UK South', 'uksouth'],
80
- ['UK West', 'ukwest'],
81
- ['Germany Central', 'germanycentral'],
82
- ['Germany Northeast', 'germanynortheast'],
83
- ['Germany West Central', 'germanywestcentral'],
84
- ['Germany North', 'germanynorth'],
85
- ['Switzerland North', 'switzerlandnorth'],
86
- ['Switzerland West', 'switzerlandwest'],
87
- ['Norway West', 'norwaywest'],
88
- ['Norway East', 'norwayeast'],
89
- ['East Asia', 'eastasia'],
90
- ['Southeast Asia', 'southeastasia'],
91
- ['Australia Central', 'australiacentral'],
92
- ['Australia Central 2', 'australiacentral2'],
93
- ['Australia East', 'australiaeast'],
94
- ['Australia Southeast', 'australiasoutheast'],
95
- ['China East', 'chinaeast'],
96
- ['China North', 'chinanorth'],
97
- ['China East 2', 'chinaeast2'],
98
- ['China North 2', 'chinanorth2'],
99
- ['Central India', 'centralindia'],
100
- ['South India', 'southindia'],
101
- ['West India', 'westindia'],
102
- ['Japan East', 'japaneast'],
103
- ['Japan West', 'japanwest'],
104
- ['Korea Central', 'koreacentral'],
105
- ['Korea South', 'koreasouth'],
106
- ['South Africa North', 'southafricanorth'],
107
- ['South Africa West', 'southafricawest'],
108
- ['UAE Central', 'uaecentral'],
109
- ['UAE North', 'uaenorth']
110
- ]
111
- end
112
-
113
- validates :region, inclusion: { in: regions.collect(&:second),
114
- message: "%{value} must be lowercase eg. 'eastus'. No special characters allowed." }
70
+ [:image, :new_volume]
71
+ end
72
+
73
+ def regions
74
+ return unless sub_id.present?
75
+ sdk.list_regions(sub_id).value.map { |loc| [loc.display_name, loc.name] }
76
+ end
115
77
 
116
78
  def resource_groups
117
79
  sdk.rgs
118
80
  end
119
81
 
120
82
  def test_connection(options = {})
121
- sdk.rgs.each do |rg|
122
- puts "#{rg}"
123
- end
124
- super(options)
83
+ super
84
+ errors[:user].empty? && errors[:password].empty? && errors[:uuid].empty? && errors[:app_ident].empty? && regions
85
+ rescue StandardError => e
86
+ errors[:base] << e.message
87
+ rescue Excon::Error::Socket => e
88
+ errors[:base] << e.message
125
89
  end
126
90
 
127
91
  def new_vm(args = {})
128
92
  return AzureRmCompute.new(sdk: sdk) if args.empty?
129
93
  opts = vm_instance_defaults.merge(args.to_h).deep_symbolize_keys
130
94
  # convert rails nested_attributes into a plain hash
131
- nested_args = opts.delete(:interfaces_attributes)
132
- opts[:interfaces] = nested_attributes_for(:interfaces, nested_args) if nested_args
133
-
95
+ [:interfaces, :volumes].each do |collection|
96
+ nested_args = opts.delete("#{collection}_attributes".to_sym)
97
+ opts[collection] = nested_attributes_for(collection, nested_args) if nested_args
98
+ end
134
99
  opts.reject! { |k, v| v.nil? }
135
100
 
136
101
  raw_vm = initialize_vm(location: region,
@@ -149,13 +114,54 @@ module ForemanAzureRm
149
114
  ifaces << new_interface(iface_attrs)
150
115
  end
151
116
  end
152
- AzureRmCompute.new(azure_vm: raw_vm ,sdk: sdk, resource_group: opts[:resource_group], nics: ifaces, script_command: opts[:script_command], script_uris: opts[:script_uris])
117
+
118
+ vols = opts.fetch(:volumes, []).map { |vols_attrs| new_volume(vols_attrs) } if opts[:volumes].present?
119
+
120
+ AzureRmCompute.new(azure_vm: raw_vm ,sdk: sdk, resource_group: opts[:resource_group], nics: ifaces, volumes: vols, script_command: opts[:script_command], script_uris: opts[:script_uris])
153
121
  end
154
122
 
155
123
  def provided_attributes
156
124
  super.merge({ :ip => :provisioning_ip_address })
157
125
  end
158
126
 
127
+ def image_exists?(image)
128
+ image_type, image_id = image.split('://')
129
+ case image_type
130
+ when 'marketplace'
131
+ begin
132
+ urn = image_id.split(':')
133
+ publisher = urn[0]
134
+ offer = urn[1]
135
+ sku = urn[2]
136
+ version = urn[3]
137
+ if version == "latest"
138
+ all_versions = sdk.list_versions(region, publisher, offer, sku).map(&:name)
139
+ return true if all_versions.any?
140
+ end
141
+ sdk.get_marketplace_image(region, publisher, offer, sku, version).present?
142
+ rescue StandardError => e
143
+ return false
144
+ end
145
+ when 'gallery'
146
+ gallery_images_list = sdk.list_resources(filter: "resourceType eq 'Microsoft.Compute/galleries/images'")
147
+ gallery_image = gallery_images_list.detect { |gal_img| gal_img.id.split('/')[-1] == image_id }
148
+ if gallery_image.present?
149
+ rg_name = gallery_image.id.split('/')[4]
150
+ gallery_name = gallery_image.name.split('/')[0]
151
+ image_versions = sdk.list_gallery_image_versions(rg_name, gallery_name, image_id)
152
+ target_regions = image_versions.map do |image_version|
153
+ image_version.publishing_profile.target_regions.map(&:name)
154
+ end.flatten.uniq.map { |tgt_reg| tgt_reg.gsub(/\s+/, '').downcase }
155
+ return true if target_regions.include? region
156
+ end
157
+ when 'custom'
158
+ custom_image = sdk.list_custom_images.detect { |custom_img| custom_img.name == image_id && custom_img.location == region }
159
+ return custom_image.present?
160
+ else
161
+ false
162
+ end
163
+ end
164
+
159
165
  def available_vnets(attr = {})
160
166
  virtual_networks
161
167
  end
@@ -188,6 +194,11 @@ module ForemanAzureRm
188
194
  true
189
195
  end
190
196
 
197
+ def new_volume(attrs = {})
198
+ args = { :disk_size_gb => 0, :data_disk_caching => "", 'persisted?' => false }.merge(attrs.to_h)
199
+ OpenStruct.new(args)
200
+ end
201
+
191
202
  def vm_sizes
192
203
  sdk.list_vm_sizes(region)
193
204
  end
@@ -198,7 +209,8 @@ module ForemanAzureRm
198
209
 
199
210
  def vm_instance_defaults
200
211
  super.deep_merge(
201
- interfaces: [new_interface]
212
+ interfaces: [new_interface],
213
+ volumes: [new_volume]
202
214
  )
203
215
  end
204
216
 
@@ -212,6 +224,10 @@ module ForemanAzureRm
212
224
  ifaces
213
225
  end
214
226
 
227
+ def vm_disks(vm)
228
+ vm.storage_profile.data_disks
229
+ end
230
+
215
231
  def vms(attrs = {})
216
232
  container = VMContainer.new
217
233
  # Load all vms of the region
@@ -276,6 +292,7 @@ module ForemanAzureRm
276
292
  image_id: args[:image_id],
277
293
  os_disk_caching: args[:os_disk_caching],
278
294
  premium_os_disk: args[:premium_os_disk],
295
+ data_disks: args[:volumes_attributes],
279
296
  custom_data: args[:user_data],
280
297
  script_command: args[:script_command],
281
298
  script_uris: args[:script_uris],
@@ -283,7 +300,7 @@ module ForemanAzureRm
283
300
  logger.debug "Virtual Machine #{args[:vm_name]} Created Successfully."
284
301
  create_vm_extension(region, args)
285
302
  # return the vm object using azure_vm
286
- AzureRmCompute.new(azure_vm: vm, sdk: sdk, resource_group: args[:resource_group], nics: vm_nics(vm), script_command: user_command, script_uris: args[:script_uris])
303
+ AzureRmCompute.new(azure_vm: vm, sdk: sdk, resource_group: args[:resource_group], nics: vm_nics(vm), volumes: vm_disks(vm), script_command: user_command, script_uris: args[:script_uris])
287
304
  rescue RuntimeError => e
288
305
  Foreman::Logging.exception('Unhandled AzureRm error', e)
289
306
  destroy_vm vm.id if vm
@@ -310,10 +327,8 @@ module ForemanAzureRm
310
327
  end
311
328
  end
312
329
  end
313
- if os_disk.present?
314
- sdk.delete_disk(rg_name, os_disk.name)
315
- end
316
-
330
+ sdk.delete_disk(rg_name, os_disk.name) if os_disk.present?
331
+ data_disks.each { |data_disk| sdk.delete_disk(rg_name, data_disk.name) } if data_disks.present?
317
332
  true
318
333
  rescue ActiveRecord::RecordNotFound
319
334
  logger.info "Could not find the selected vm."
@@ -5,6 +5,7 @@ module ForemanAzureRm
5
5
  attr_accessor :resource_group
6
6
  attr_accessor :nics
7
7
  attr_accessor :script_command, :script_uris
8
+ attr_accessor :volumes
8
9
 
9
10
  delegate :name, to: :azure_vm, allow_nil: true
10
11
 
@@ -12,6 +13,7 @@ module ForemanAzureRm
12
13
  sdk: sdk,
13
14
  resource_group: azure_vm.resource_group,
14
15
  nics: [],
16
+ volumes: [],
15
17
  script_command: nil,
16
18
  script_uris: nil)
17
19
 
@@ -19,6 +21,7 @@ module ForemanAzureRm
19
21
  @sdk = sdk
20
22
  @resource_group ||= resource_group
21
23
  @nics ||= nics
24
+ @volumes ||= volumes
22
25
  @script_command ||= script_command
23
26
  @script_uris ||= script_uris
24
27
  @azure_vm.hardware_profile ||= ComputeModels::HardwareProfile.new
@@ -119,6 +122,20 @@ module ForemanAzureRm
119
122
  []
120
123
  end
121
124
 
125
+ def data_disks
126
+ @data_disks ||= @azure_vm.storage_profile.data_disks || []
127
+ end
128
+
129
+ def volumes
130
+ return @volumes if data_disks.empty?
131
+ volumes = data_disks.map do |disk|
132
+ OpenStruct.new(:disk => disk, :persisted? => true)
133
+ end
134
+ end
135
+
136
+ def volumes_attributes=(attrs)
137
+ end
138
+
122
139
  def identity
123
140
  @azure_vm.name
124
141
  end
@@ -169,7 +186,17 @@ module ForemanAzureRm
169
186
  def image_uuid
170
187
  image = @azure_vm.storage_profile.image_reference
171
188
  return nil unless image
172
- "#{image.publisher}:#{image.offer}:#{image.sku}:#{image.version}"
189
+ if image.id.nil?
190
+ return "marketplace://#{image.publisher}:#{image.offer}:#{image.sku}:#{image.version}"
191
+ else
192
+ image_rg = image.id.split('/')[4]
193
+ image_name = image.id.split('/')[-1]
194
+ if sdk.list_custom_images.find { |custom_img| custom_img.name == image_name }
195
+ return "custom://#{image_name}"
196
+ elsif sdk.fetch_gallery_image_id(image_rg, image_name)
197
+ return "gallery://#{image_name}"
198
+ end
199
+ end
173
200
  end
174
201
 
175
202
  alias_method :image_id, :image_uuid
@@ -188,8 +215,12 @@ module ForemanAzureRm
188
215
  # Index is based on script_command that is being injected
189
216
  # from the code in #create_vm. It can be partly hard-coded
190
217
  # since the command shall no change frequently.
191
- user_cmd_index = (vm_extension.settings["commandToExecute"].index("-c"))+ 4
192
- script_command = vm_extension.settings["commandToExecute"][user_cmd_index..-2]
218
+ if ssh_key_data.nil?
219
+ user_cmd_index = (vm_extension.settings["commandToExecute"].index("-c"))+ 4
220
+ script_command = vm_extension.settings["commandToExecute"][user_cmd_index..-2]
221
+ else
222
+ vm_extension.settings["commandToExecute"]
223
+ end
193
224
  else
194
225
  @script_command
195
226
  end