foreman_azure_rm 2.0.6 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -15
  3. data/app/helpers/azure_compute_resource_helper.rb +13 -0
  4. data/app/models/concerns/foreman_azure_rm/vm_extensions/managed_vm.rb +66 -28
  5. data/app/models/foreman_azure_rm/azure_rm.rb +83 -31
  6. data/app/models/foreman_azure_rm/azure_rm_compute.rb +34 -3
  7. data/app/views/compute_resources/form/_azurerm.html.erb +1 -5
  8. data/app/views/compute_resources_vms/form/azurerm/_base.html.erb +1 -1
  9. data/app/views/compute_resources_vms/form/azurerm/_volume.html.erb +20 -0
  10. data/app/views/compute_resources_vms/index/_azurerm.html.erb +12 -12
  11. data/app/views/images/form/_azurerm.html.erb +2 -2
  12. data/db/migrate/20200211073049_fix_case_azure_rm.rb +5 -0
  13. data/db/migrate/20200507103900_fix_image_uuid_prefix.rb +8 -0
  14. data/lib/foreman_azure_rm.rb +3 -0
  15. data/lib/foreman_azure_rm/azure_sdk_adapter.rb +68 -2
  16. data/lib/foreman_azure_rm/engine.rb +13 -0
  17. data/lib/foreman_azure_rm/version.rb +1 -1
  18. data/locale/Makefile +61 -0
  19. data/locale/action_names.rb +5 -0
  20. data/locale/ca/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  21. data/locale/ca/foreman_azure_rm.po +185 -0
  22. data/locale/cs_CZ/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  23. data/locale/cs_CZ/foreman_azure_rm.po +189 -0
  24. data/locale/de/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  25. data/locale/de/foreman_azure_rm.po +191 -0
  26. data/locale/en/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  27. data/locale/en/foreman_azure_rm.po +183 -0
  28. data/locale/en_GB/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  29. data/locale/en_GB/foreman_azure_rm.po +187 -0
  30. data/locale/es/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  31. data/locale/es/foreman_azure_rm.po +190 -0
  32. data/locale/foreman_azure_rm.pot +248 -0
  33. data/locale/fr/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  34. data/locale/fr/foreman_azure_rm.po +187 -0
  35. data/locale/gl/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  36. data/locale/gl/foreman_azure_rm.po +185 -0
  37. data/locale/it/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  38. data/locale/it/foreman_azure_rm.po +187 -0
  39. data/locale/ja/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  40. data/locale/ja/foreman_azure_rm.po +187 -0
  41. data/locale/ko/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  42. data/locale/ko/foreman_azure_rm.po +187 -0
  43. data/locale/nl_NL/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  44. data/locale/nl_NL/foreman_azure_rm.po +188 -0
  45. data/locale/pl/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  46. data/locale/pl/foreman_azure_rm.po +189 -0
  47. data/locale/pt_BR/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  48. data/locale/pt_BR/foreman_azure_rm.po +192 -0
  49. data/locale/ru/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  50. data/locale/ru/foreman_azure_rm.po +192 -0
  51. data/locale/sv_SE/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  52. data/locale/sv_SE/foreman_azure_rm.po +187 -0
  53. data/locale/zh_CN/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  54. data/locale/zh_CN/foreman_azure_rm.po +188 -0
  55. data/locale/zh_TW/LC_MESSAGES/foreman_azure_rm.mo +0 -0
  56. data/locale/zh_TW/foreman_azure_rm.po +187 -0
  57. metadata +59 -2
@@ -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
@@ -3,8 +3,4 @@
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.class.regions, {}, {:label => _('Azure Region'), :required => true }) %>
7
-
8
- <div class="col-md-offset-2">
9
- <%= test_connection_button_f(f, true) %>
10
- </div>
6
+ <%= regions_list(@compute_resource, f) %>
@@ -155,7 +155,7 @@
155
155
  %>
156
156
 
157
157
  <%= selectable_f f, :os_disk_caching, %w(None ReadOnly ReadWrite),
158
- { :include_blank => _('Please select OS Disk Caching method') },
158
+ { :include_blank => _("Azure's Default") },
159
159
  {
160
160
  :label => _('OS Disk Caching'),
161
161
  :label_help => _("Default ReadWrite"),
@@ -0,0 +1,20 @@
1
+ <%= number_f f, :disk_size_gb,
2
+ {
3
+ :class => "col-md-2",
4
+ :label => _("Size (GB)"), :label_size => "col-md-2",
5
+ :required => true,
6
+ :min => 0,
7
+ :value => f.object.disk_size_gb || f.object.disk.disk_size_gb,
8
+ :help_inline => _("Additional number of disks can be added based on VM Size. For more details, please refer to Microsoft Azure's documentation")
9
+ }
10
+ %>
11
+
12
+ <%= selectable_f f, :data_disk_caching, options_for_select(["None", "ReadOnly", "ReadWrite"],
13
+ :selected => f.object.data_disk_caching || f.object.disk.caching),
14
+ { :include_blank => _("Azure's default") },
15
+ {
16
+ :class => "col-md-2",
17
+ :label => _('Data Disk Caching'),
18
+ :required => true
19
+ }
20
+ %>
@@ -1,14 +1,14 @@
1
- <table class="table table-bordered" data-table="inline">
2
- <thead>
3
- <tr>
4
- <th><%= _('Name') %></th>
5
- <th><%= _('Size') %></th>
6
- <th><%= _('Resource Group') %></th>
7
- <th><%= _('Region') %></th>
8
- <th><%= _('State') %></th>
9
- <th><%= _('Actions') %></th>
10
- </tr>
11
- </thead>
1
+ <thead>
2
+ <tr>
3
+ <th><%= _('Name') %></th>
4
+ <th><%= _('Size') %></th>
5
+ <th><%= _('Resource Group') %></th>
6
+ <th><%= _('Region') %></th>
7
+ <th><%= _('State') %></th>
8
+ <th><%= _('Actions') %></th>
9
+ </tr>
10
+ </thead>
11
+ <tbody>
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) %></td>
@@ -27,4 +27,4 @@
27
27
  </td>
28
28
  </tr>
29
29
  <% end %>
30
- </table>
30
+ </tbody>
@@ -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, :keep_value => true, :help_inline => _("Password to authenticate with - used for SSH finish step.") %>
5
- <%= image_field(f, :label => _("Marketplace Image URN"), :help_inline => _("Marketplace URN (e.g. OpenLogic:CentOS:7.5:latest)")) %>
6
- <%= checkbox_f f, :user_data, :help_inline => _("Does this image support user data input?") %>
5
+ <%= image_field(f, :label => _("Azure Image Name"), :help_inline => _("For custom or shared gallery image, use prefix 'custom://' or 'gallery://'. For public and RHEL-byos images, prefix the uuid with 'marketplace://'. (e.g. 'marketplace://OpenLogic:CentOS:7.5:latest' or 'custom://image-name')")) %>
6
+ <%= checkbox_f f, :user_data, :help_inline => _("Does this image support user data input?") %>
@@ -0,0 +1,5 @@
1
+ class FixCaseAzureRm < ActiveRecord::Migration[5.2]
2
+ def change
3
+ ComputeResource.where(type: 'ForemanAzureRM::AzureRM').update_all(type: 'ForemanAzureRm::AzureRm')
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ class FixImageUuidPrefix < ActiveRecord::Migration[5.2]
2
+ def up
3
+ Image.where(compute_resource: ForemanAzureRm::AzureRm.unscoped.all).update_all("uuid = concat('marketplace://', uuid)")
4
+ end
5
+
6
+ def down
7
+ end
8
+ end
@@ -3,15 +3,18 @@ require 'azure_mgmt_resources'
3
3
  require 'azure_mgmt_network'
4
4
  require 'azure_mgmt_storage'
5
5
  require 'azure_mgmt_compute'
6
+ require 'azure_mgmt_subscriptions'
6
7
 
7
8
  module ForemanAzureRm
8
9
  Storage = Azure::Storage::Profiles::Latest::Mgmt
9
10
  Network = Azure::Network::Profiles::Latest::Mgmt
10
11
  Compute = Azure::Compute::Profiles::Latest::Mgmt
11
12
  Resources = Azure::Resources::Profiles::Latest::Mgmt
13
+ Subscriptions = Azure::Subscriptions::Profiles::Latest::Mgmt
12
14
 
13
15
  StorageModels = Storage::Models
14
16
  NetworkModels = Network::Models
15
17
  ComputeModels = Compute::Models
16
18
  ResourceModels = Resources::Models
19
+ SubscriptionModels = Subscriptions::Models
17
20
  end
@@ -23,6 +23,10 @@ module ForemanAzureRm
23
23
  @storage_client ||= Storage::Client.new(azure_credentials)
24
24
  end
25
25
 
26
+ def subscription_client
27
+ @subscription_client ||= Subscriptions::Client.new(azure_credentials)
28
+ end
29
+
26
30
  def azure_credentials
27
31
  provider = MsRestAzure::ApplicationTokenProvider.new(
28
32
  @tenant,
@@ -37,6 +41,14 @@ module ForemanAzureRm
37
41
  }
38
42
  end
39
43
 
44
+ def list_regions(subscription_id)
45
+ subscription_client.subscriptions.list_locations(subscription_id)
46
+ end
47
+
48
+ def list_resources(filter)
49
+ resource_client.resources.list(filter)
50
+ end
51
+
40
52
  def rgs
41
53
  rgs = resource_client.resource_groups.list
42
54
  rgs.map(&:name)
@@ -58,6 +70,10 @@ module ForemanAzureRm
58
70
  network_client.network_interfaces.get(rg_name, nic_name)
59
71
  end
60
72
 
73
+ def vm_disk(rg_name, disk_name)
74
+ compute_client.disks.get(rg_name, disk_name)
75
+ end
76
+
61
77
  def get_vm_extension(rg_name, vm_name, vm_extension_name)
62
78
  compute_client.virtual_machine_extensions.get(rg_name, vm_name, vm_extension_name)
63
79
  end
@@ -77,6 +93,38 @@ module ForemanAzureRm
77
93
  compute_client.virtual_machines.get(rg_name, vm_name)
78
94
  end
79
95
 
96
+ def get_marketplace_image(location, publisher_name, offer, skus, version)
97
+ compute_client.virtual_machine_images.get(location, publisher_name, offer, skus, version)
98
+ end
99
+
100
+ def list_versions(location, publisher_name, offer, skus)
101
+ compute_client.virtual_machine_images.list(location, publisher_name, offer, skus)
102
+ end
103
+
104
+ def list_custom_images
105
+ compute_client.images.list
106
+ end
107
+
108
+ def get_custom_image(rg_name, image_name)
109
+ compute_client.images.get(rg_name, image_name)
110
+ end
111
+
112
+ def list_galleries
113
+ compute_client.galleries.list
114
+ end
115
+
116
+ def list_gallery_images(rg_name, gallery_name)
117
+ compute_client.gallery_images.list_by_gallery(rg_name, gallery_name)
118
+ end
119
+
120
+ def get_gallery_image(rg_name, gallery_name, gallery_image_name)
121
+ compute_client.gallery_images.get(rg_name, gallery_name, gallery_image_name)
122
+ end
123
+
124
+ def list_gallery_image_versions(rg_name, gallery_name, gallery_image_name)
125
+ compute_client.gallery_image_versions.list_by_gallery_image(rg_name, gallery_name, gallery_image_name)
126
+ end
127
+
80
128
  def get_storage_accts
81
129
  result = storage_client.storage_accounts.list
82
130
  result.value
@@ -113,8 +161,8 @@ module ForemanAzureRm
113
161
  compute_client.virtual_machines.delete(rg_name, vm_name)
114
162
  end
115
163
 
116
- def delete_disk(rg_name, osdisk_name)
117
- compute_client.disks.delete(rg_name, osdisk_name)
164
+ def delete_disk(rg_name, disk_name)
165
+ compute_client.disks.delete(rg_name, disk_name)
118
166
  end
119
167
 
120
168
  def check_vm_status(rg_name, vm_name)
@@ -141,5 +189,23 @@ module ForemanAzureRm
141
189
  compute_client.virtual_machines.power_off(rg_name, vm_name)
142
190
  compute_client.virtual_machines.deallocate(rg_name, vm_name)
143
191
  end
192
+
193
+ def self.gallery_caching(rg_name)
194
+ @gallery_caching ||= {}
195
+ @gallery_caching[rg_name] ||= {}
196
+ end
197
+
198
+ def actual_gallery_image_id(rg_name, image_id)
199
+ gallery_names = list_galleries.map(&:name)
200
+ gallery_names.each do |gallery|
201
+ gallery_image = list_gallery_images(rg_name, gallery).detect { |image| image.name == image_id }
202
+ return gallery_image&.id
203
+ end
204
+ nil
205
+ end
206
+
207
+ def fetch_gallery_image_id(rg_name, image_id)
208
+ AzureSdkAdapter.gallery_caching(rg_name)[image_id] ||= actual_gallery_image_id(rg_name, image_id)
209
+ end
144
210
  end
145
211
  end
@@ -5,6 +5,7 @@ module ForemanAzureRm
5
5
  #autoloading all files inside lib dir
6
6
  config.eager_load_paths += Dir["#{config.root}/lib"]
7
7
  config.eager_load_paths += Dir["#{config.root}/app/models/concerns/foreman_azure_rm/vm_extensions/"]
8
+ config.eager_load_paths += Dir["#{config.root}/app/helpers/"]
8
9
 
9
10
  initializer 'foreman_azure_rm.register_plugin', :before => :finisher_hook do
10
11
  Foreman::Plugin.register :foreman_azure_rm do
@@ -14,6 +15,13 @@ module ForemanAzureRm
14
15
  end
15
16
  end
16
17
 
18
+ # Add any db migrations
19
+ initializer "foreman_azure_rm.load_app_instance_data" do |app|
20
+ ForemanAzureRm::Engine.paths['db/migrate'].existent.each do |path|
21
+ app.config.paths['db/migrate'] << path
22
+ end
23
+ end
24
+
17
25
  initializer "foreman_azure_rm.add_rabl_view_path" do
18
26
  Rabl.configure do |config|
19
27
  config.view_paths << ForemanAzureRm::Engine.root.join('app', 'views')
@@ -31,6 +39,11 @@ module ForemanAzureRm
31
39
  require 'azure_mgmt_network'
32
40
  require 'azure_mgmt_storage'
33
41
  require 'azure_mgmt_compute'
42
+ require 'azure_mgmt_subscriptions'
43
+
44
+ # Add format validation for azure images
45
+ ::Image.validates :uuid, uniqueness: { scope: :compute_resource_id, case_sensitive: false }, format: { with: /\A((marketplace|custom|gallery):\/\/)[^:]+(:[^:]+:[^:]+:[^:]+)?\z/,
46
+ message: "Incorrect UUID format" }, if: -> (image){ image.compute_resource.is_a? ForemanAzureRm::AzureRm }
34
47
 
35
48
  # Use excon as default so that HTTP Proxy settings of foreman works
36
49
  Faraday::default_adapter=:excon
@@ -1,3 +1,3 @@
1
1
  module ForemanAzureRm
2
- VERSION = '2.0.6'.freeze
2
+ VERSION = '2.1.2'.freeze
3
3
  end
@@ -0,0 +1,61 @@
1
+ #
2
+ # Makefile for PO merging and MO generation. More info in the README.
3
+ #
4
+ # make all-mo (default) - generate MO files
5
+ # make check - check translations using translate-tool
6
+ # make tx-update - download and merge translations from Transifex
7
+ # make clean - clean everything
8
+ #
9
+ DOMAIN = foreman_azure_rm
10
+ VERSION = $(shell ruby -e 'require "rubygems";spec = Gem::Specification::load(Dir.glob("../*.gemspec")[0]);puts spec.version')
11
+ POTFILE = $(DOMAIN).pot
12
+ MOFILE = $(DOMAIN).mo
13
+ POFILES = $(shell find . -name '$(DOMAIN).po')
14
+ MOFILES = $(patsubst %.po,%.mo,$(POFILES))
15
+ POXFILES = $(patsubst %.po,%.pox,$(POFILES))
16
+ EDITFILES = $(patsubst %.po,%.edit.po,$(POFILES))
17
+
18
+ %.mo: %.po
19
+ mkdir -p $(shell dirname $@)/LC_MESSAGES
20
+ msgfmt -o $(shell dirname $@)/LC_MESSAGES/$(MOFILE) $<
21
+
22
+ # Generate MO files from PO files
23
+ all-mo: $(MOFILES)
24
+
25
+ # Check for malformed strings
26
+ %.pox: %.po
27
+ msgfmt -c $<
28
+ pofilter --nofuzzy -t variables -t blank -t urls -t emails -t long -t newlines \
29
+ -t endwhitespace -t endpunc -t puncspacing -t options -t printf -t validchars --gnome $< > $@
30
+ cat $@
31
+ ! grep -q msgid $@
32
+
33
+ %.edit.po:
34
+ touch $@
35
+
36
+ check: $(POXFILES)
37
+
38
+ # Unify duplicate translations
39
+ uniq-po:
40
+ for f in $(shell find ./ -name "*.po") ; do \
41
+ msguniq $$f -o $$f ; \
42
+ done
43
+
44
+ tx-pull: $(EDITFILES)
45
+ tx pull -f
46
+ for f in $(EDITFILES) ; do \
47
+ sed -i 's/^\("Project-Id-Version: \).*$$/\1$(DOMAIN) $(VERSION)\\n"/' $$f; \
48
+ done
49
+
50
+ tx-update: tx-pull
51
+ @echo
52
+ @echo Run rake plugin:gettext[$(DOMAIN)] from the Foreman installation, then make -C locale mo-files to finish
53
+ @echo
54
+
55
+ mo-files: $(MOFILES)
56
+ git add $(POFILES) $(POTFILE) ../locale/*/LC_MESSAGES
57
+ git commit -m "i18n - pulling from tx"
58
+ @echo
59
+ @echo Changes commited!
60
+ @echo
61
+
@@ -0,0 +1,5 @@
1
+ # Autogenerated!
2
+ _("Action with sub plans")
3
+ _("Import facts")
4
+ _("Import Puppet classes")
5
+ _("Remote action:")
@@ -0,0 +1,185 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the foreman_azure_rm package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ # Translators:
7
+ # Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>, 2020
8
+ #
9
+ msgid ""
10
+ msgstr ""
11
+ "Project-Id-Version: foreman_azure_rm 2.0.8\n"
12
+ "Report-Msgid-Bugs-To: \n"
13
+ "PO-Revision-Date: 2020-04-21 13:58+0000\n"
14
+ "Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>, 2020\n"
15
+ "Language-Team: Catalan (https://www.transifex.com/foreman/teams/114/ca/)\n"
16
+ "MIME-Version: 1.0\n"
17
+ "Content-Type: text/plain; charset=UTF-8\n"
18
+ "Content-Transfer-Encoding: 8bit\n"
19
+ "Language: ca\n"
20
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
21
+
22
+ msgid "%{vm_size} VM Size"
23
+ msgstr ""
24
+
25
+ msgid "Action with sub plans"
26
+ msgstr ""
27
+
28
+ msgid "Actions"
29
+ msgstr "Accions"
30
+
31
+ msgid "Additional number of disks can be added based on VM Size. For more details, please refer to Microsoft Azure's documentation"
32
+ msgstr ""
33
+
34
+ msgid "Azure Region"
35
+ msgstr ""
36
+
37
+ msgid "Azure Resource Manager as a compute resource for Foreman"
38
+ msgstr ""
39
+
40
+ msgid "Azure Subnet"
41
+ msgstr ""
42
+
43
+ msgid "Azure's Default"
44
+ msgstr ""
45
+
46
+ msgid "Azure's default"
47
+ msgstr ""
48
+
49
+ msgid "Client ID"
50
+ msgstr ""
51
+
52
+ msgid "Client ID for AzureRm"
53
+ msgstr ""
54
+
55
+ msgid "Client Secret"
56
+ msgstr ""
57
+
58
+ msgid "Client Secret for AzureRm"
59
+ msgstr ""
60
+
61
+ msgid "Comma seperated file URIs"
62
+ msgstr ""
63
+
64
+ msgid "Custom Script Command"
65
+ msgstr ""
66
+
67
+ msgid "Data Disk Caching"
68
+ msgstr ""
69
+
70
+ msgid "Default ReadWrite"
71
+ msgstr ""
72
+
73
+ msgid "Does this image support user data input?"
74
+ msgstr "La imatge admet l'entrada de dades d'usuari?"
75
+
76
+ msgid "Image"
77
+ msgstr "Imatge"
78
+
79
+ msgid "Import Puppet classes"
80
+ msgstr ""
81
+
82
+ msgid "Import facts"
83
+ msgstr ""
84
+
85
+ msgid "Load Regions"
86
+ msgstr ""
87
+
88
+ msgid "Marketplace Image URN"
89
+ msgstr ""
90
+
91
+ msgid "Marketplace URN (e.g. OpenLogic:CentOS:7.5:latest)"
92
+ msgstr ""
93
+
94
+ msgid "Name"
95
+ msgstr "Nom"
96
+
97
+ msgid "OS Disk Caching"
98
+ msgstr ""
99
+
100
+ msgid "Password"
101
+ msgstr "Contrasenya"
102
+
103
+ msgid "Password to authenticate with - used for SSH finish step."
104
+ msgstr ""
105
+
106
+ msgid "Platform"
107
+ msgstr ""
108
+
109
+ msgid "Please select a Resource Group"
110
+ msgstr ""
111
+
112
+ msgid "Please select a VM Size"
113
+ msgstr ""
114
+
115
+ msgid "Please select an image"
116
+ msgstr "Si us plau, seleccioneu una imatge"
117
+
118
+ msgid "Premium OS Disk"
119
+ msgstr ""
120
+
121
+ msgid "Properties"
122
+ msgstr "Propietats"
123
+
124
+ msgid "Public IP"
125
+ msgstr ""
126
+
127
+ msgid "Region"
128
+ msgstr "Regió"
129
+
130
+ msgid "Reload Images, Sizes, vNets"
131
+ msgstr ""
132
+
133
+ msgid "Remote action:"
134
+ msgstr ""
135
+
136
+ msgid "Resource Group"
137
+ msgstr ""
138
+
139
+ msgid "SSH Key"
140
+ msgstr ""
141
+
142
+ msgid "Select"
143
+ msgstr "Selecciona"
144
+
145
+ msgid "Size"
146
+ msgstr "Mida"
147
+
148
+ msgid "Size (GB)"
149
+ msgstr "Mida (GB)"
150
+
151
+ msgid "State"
152
+ msgstr "Estat"
153
+
154
+ msgid "Static Private IP"
155
+ msgstr ""
156
+
157
+ msgid "Subscription ID"
158
+ msgstr "ID de subscripció"
159
+
160
+ msgid "Subscription ID for AzureRm"
161
+ msgstr ""
162
+
163
+ msgid "Tenant ID"
164
+ msgstr ""
165
+
166
+ msgid "The region you selected has no sizes associated with it"
167
+ msgstr ""
168
+
169
+ msgid "The selected image has no associated compute resource"
170
+ msgstr ""
171
+
172
+ msgid "The selected region has no subnets"
173
+ msgstr ""
174
+
175
+ msgid "The user that will be used to SSH into the VM for completion"
176
+ msgstr ""
177
+
178
+ msgid "To perform commands as root, prefix it with 'sudo'"
179
+ msgstr ""
180
+
181
+ msgid "Username"
182
+ msgstr "Nom d'usuari"
183
+
184
+ msgid "VM Size"
185
+ msgstr ""