foreman_kubevirt 0.1.3 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +5 -3
  3. data/app/assets/javascripts/bundle.js +1 -0
  4. data/app/controllers/foreman_kubevirt/concerns/api/compute_resources_controller_extensions.rb +8 -16
  5. data/app/models/foreman_kubevirt/compute_attribute_extensions.rb +8 -0
  6. data/app/models/foreman_kubevirt/kubevirt.rb +65 -17
  7. data/app/validators/volume_validator.rb +13 -0
  8. data/app/views/compute_resources/form/_kubevirt.html.erb +5 -3
  9. data/app/views/compute_resources_vms/form/kubevirt/_volume.html.erb +5 -2
  10. data/lib/foreman_kubevirt/engine.rb +2 -0
  11. data/lib/foreman_kubevirt/version.rb +1 -1
  12. data/locale/action_names.rb +5 -0
  13. data/locale/ca/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  14. data/locale/ca/foreman_kubevirt.po +170 -0
  15. data/locale/cs_CZ/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  16. data/locale/cs_CZ/foreman_kubevirt.po +170 -0
  17. data/locale/de/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  18. data/locale/de/foreman_kubevirt.po +170 -0
  19. data/locale/en/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  20. data/locale/en/foreman_kubevirt.edit.po +219 -0
  21. data/locale/en/foreman_kubevirt.po +162 -11
  22. data/locale/en/foreman_kubevirt.po.time_stamp +0 -0
  23. data/locale/en_GB/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  24. data/locale/en_GB/foreman_kubevirt.po +170 -0
  25. data/locale/es/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  26. data/locale/es/foreman_kubevirt.po +170 -0
  27. data/locale/foreman_kubevirt.pot +232 -8
  28. data/locale/fr/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  29. data/locale/fr/foreman_kubevirt.po +170 -0
  30. data/locale/gemspec.rb +1 -1
  31. data/locale/gl/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  32. data/locale/gl/foreman_kubevirt.po +170 -0
  33. data/locale/it/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  34. data/locale/it/foreman_kubevirt.po +170 -0
  35. data/locale/ja/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  36. data/locale/ja/foreman_kubevirt.po +170 -0
  37. data/locale/ko/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  38. data/locale/ko/foreman_kubevirt.po +170 -0
  39. data/locale/nl_NL/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  40. data/locale/nl_NL/foreman_kubevirt.po +177 -0
  41. data/locale/pl/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  42. data/locale/pl/foreman_kubevirt.po +176 -0
  43. data/locale/pt_BR/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  44. data/locale/pt_BR/foreman_kubevirt.po +178 -0
  45. data/locale/ru/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  46. data/locale/ru/foreman_kubevirt.po +180 -0
  47. data/locale/sv_SE/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  48. data/locale/sv_SE/foreman_kubevirt.po +176 -0
  49. data/locale/zh_CN/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  50. data/locale/zh_CN/foreman_kubevirt.po +177 -0
  51. data/locale/zh_TW/LC_MESSAGES/foreman_kubevirt.mo +0 -0
  52. data/locale/zh_TW/foreman_kubevirt.po +175 -0
  53. data/test/factories/compute_resource_factories.rb +6 -6
  54. data/test/factories/host_factories.rb +41 -41
  55. data/test/factories/nic_factories.rb +25 -25
  56. data/test/models/compute_resources/kubevirt_test.rb +1 -1
  57. data/test/unit/foreman_kubevirt_test.rb +12 -1
  58. metadata +52 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0e0ae0ca0c55da65290264cdf02df32185314908
4
- data.tar.gz: 12230c05d0f34969260ad7f3efaefb0486e094b9
2
+ SHA256:
3
+ metadata.gz: 4a1ecc0522a29b6588b3f51feb09fcab28786f871ddea07b4042149a0c5a7e74
4
+ data.tar.gz: c7047e7a253dc251fc2efe3c3032e9d1dd0f298d0d3346a82532b9dc131b0b41
5
5
  SHA512:
6
- metadata.gz: baf978d956388d8fccd84cb3e48c110b6a874542736ef6987a27c45732f9e807573ab6f87088b5a32fb46fa304c16e0a0f694965664314d8380a940dd720e4c5
7
- data.tar.gz: 46c7b84303561d9a5cc2db9f72d5896775604df20263ce590f3d29f415230903e75b6ab06211478f121c717522fbea7535d9ab984bc41e82c02e57f9ff5260a9
6
+ metadata.gz: 02f1b764a26dc6211936b39bb6f6210622c59590f62de0eec90f5aa0017400547f798b94238847153a859dd35dd0c812f5407a20c9fce8c85278d9beb49a0b80
7
+ data.tar.gz: 434056ac6b789c39ea7334cc83923d30e5cec21f66908d1ddccb48a6e702c2d60774315367e895329459f12d79b15f98971bcb18d08e43bcd1d4a41b0b7d5df8
data/README.md CHANGED
@@ -55,9 +55,11 @@ To verify that the installation was successful, go to Foreman, top bar **Adminis
55
55
 
56
56
  ## Compatibility
57
57
 
58
- | Foreman Version | Plugin Version |
59
- | --------------- | --------------:|
60
- | >= 1.21.x | ~> 0.1.x |
58
+
59
+
60
+ | Foreman Version | Plugin Version | Kubevirt API Version |
61
+ | --------------- | --------------:| -------------------- |
62
+ | >= 1.21.x | ~> 0.1.x | v1alpha3 |
61
63
 
62
64
  ## Usage
63
65
  Go to **Infrastructure > Compute Resources** and click on **New Compute Resource**.
@@ -0,0 +1 @@
1
+ window.tfm = { kubevirt: { require('./foreman_kubevirt/kubevirt.js') };
@@ -2,25 +2,17 @@ module ForemanKubevirt
2
2
  module Concerns
3
3
  module Api
4
4
  module ComputeResourcesControllerExtensions
5
- module ApiPieExtensions
6
- extend ::Apipie::DSL::Concern
7
- update_api(:create, :update) do
8
- param :compute_resource, Hash do
9
- param :token, String, :desc => N_("Token for KubeVirt only")
10
- param :hostname, String, :desc => N_("Host name for KubeVirt only")
11
- param :namespace, String, :desc => N_("Namespace for KubeVirt only")
12
- param :ca_crt, String, :desc => N_("CA crt for KubeVirt only")
13
- param :api_port, String, :desc => N_("API port for KubeVirt only")
14
- end
5
+ extend ::Apipie::DSL::Concern
6
+ update_api(:create, :update) do
7
+ param :compute_resource, Hash do
8
+ param :token, String, :desc => N_("Token for KubeVirt only")
9
+ param :hostname, String, :desc => N_("Host name for KubeVirt only")
10
+ param :namespace, String, :desc => N_("Namespace for KubeVirt only")
11
+ param :ca_crt, String, :desc => N_("CA crt for KubeVirt only")
12
+ param :api_port, String, :desc => N_("API port for KubeVirt only")
15
13
  end
16
14
  end
17
15
  end
18
-
19
- extend ActiveSupport::Concern
20
-
21
- included do
22
- include ApiPieExtensions
23
- end
24
16
  end
25
17
  end
26
18
  end
@@ -0,0 +1,8 @@
1
+ module ForemanKubevirt
2
+ module ComputeAttributeExtensions
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ validates :vm_attrs, :volume => true
6
+ end
7
+ end
8
+ end
@@ -6,7 +6,7 @@ module ForemanKubevirt
6
6
  alias_attribute :token, :password
7
7
  alias_attribute :namespace, :user
8
8
  validates :hostname, :api_port, :namespace, :token, :presence => true
9
- validate :test_connection
9
+ after_validation :validate_connectivity unless Rails.env.test?
10
10
 
11
11
  def ca_cert
12
12
  attrs[:ca_cert]
@@ -52,10 +52,29 @@ module ForemanKubevirt
52
52
  ComputeResource.model_name
53
53
  end
54
54
 
55
- def test_connection(_options = {})
55
+ def test_connection(options = {})
56
+ super
57
+ validate_connectivity(options)
58
+ end
59
+
60
+ def caching_enabled
61
+ false
62
+ end
63
+
64
+ def validate_connectivity(options = {})
65
+ return unless connection_properties_valid?
66
+ return false if errors.any?
56
67
  client&.valid? && client&.virt_supported?
57
68
  rescue StandardError => e
58
- errors[:base] << e.message
69
+ if e.message =~ /401/
70
+ errors[:base] << _('The compute resource could not be authenticated')
71
+ else
72
+ errors[:base] << e.message
73
+ end
74
+ end
75
+
76
+ def connection_properties_valid?
77
+ errors[:hostname].empty? && errors[:token].empty? && errors[:namespace].empty? && errors[:api_port].empty?
59
78
  end
60
79
 
61
80
  def networks
@@ -85,11 +104,12 @@ module ForemanKubevirt
85
104
  storage_classes.map { |sc| OpenStruct.new(id: sc.name, description: "#{sc.name} (#{sc.provisioner})") }
86
105
  end
87
106
 
88
- def new_volume(attr = {})
107
+ def new_volume(attrs = {})
89
108
  return unless new_volume_errors.empty?
90
-
91
- vol = Fog::Kubevirt::Compute::Volume.new(attr)
92
- vol.boot_order = 1 if attr[:bootable] == "on" || attr[:bootable] == "true"
109
+ capacity = attrs.delete(:capacity)
110
+ args = {capacity: capacity}.merge(attrs)
111
+ vol = Fog::Kubevirt::Compute::Volume.new(args)
112
+ vol.boot_order = 1 if args[:bootable] == "on" || args[:bootable] == "true"
93
113
  vol
94
114
  end
95
115
 
@@ -139,12 +159,12 @@ module ForemanKubevirt
139
159
  options = vm_instance_defaults.merge(args.to_hash.deep_symbolize_keys)
140
160
  logger.debug("creating VM with the following options: #{options.inspect}")
141
161
 
142
- volumes = create_volumes_for_vm(options)
143
- interfaces, networks = create_network_devices_for_vm(options, volumes)
144
162
  # Add clound init user data
145
163
  user_data = { "userData" => options[:user_data] } if options[:user_data].present?
146
164
 
147
165
  begin
166
+ volumes = create_volumes_for_vm(options)
167
+ interfaces, networks = create_network_devices_for_vm(options, volumes)
148
168
  client.vms.create(:vm_name => options[:name],
149
169
  :cpus => options[:cpu_cores].to_i,
150
170
  :memory_size => convert_memory(options[:memory] + "b", :mi).to_s,
@@ -154,8 +174,8 @@ module ForemanKubevirt
154
174
  :networks => networks,
155
175
  :interfaces => interfaces)
156
176
  client.servers.get(options[:name])
157
- rescue Fog::Kubevirt::Errors::ClientError => e
158
- delete_pvcs(volumes)
177
+ rescue Exception => e
178
+ delete_pvcs(volumes) if volumes
159
179
  raise e
160
180
  end
161
181
  end
@@ -271,11 +291,33 @@ module ForemanKubevirt
271
291
  convert_memory(memory, :b)
272
292
  end
273
293
 
294
+ def plain_kubevirt_protocol
295
+ "plain.kubevirt.io".freeze
296
+ end
297
+
298
+ def token_protocol(token)
299
+ "base64url.bearer.authorization.k8s.io.#{token}"
300
+ end
301
+
302
+ def console(uuid)
303
+ vm = find_vm_by_uuid(uuid)
304
+ vnc_details = client.vminstances.get_vnc_console_details(vm.name, namespace)
305
+ token = Base64.encode64(vnc_details[:token]).delete!("\n").delete("==")
306
+ {
307
+ :host => vnc_details[:host],
308
+ :port => vnc_details[:port],
309
+ :path => vnc_details[:path],
310
+ :token_protocol => token_protocol(token),
311
+ :plain_protocol => plain_kubevirt_protocol,
312
+ :type => 'vnc',
313
+ :encrypt => true
314
+ }
315
+ end
316
+
274
317
  protected
275
318
 
276
319
  def client
277
320
  return @client if @client
278
-
279
321
  @client ||= Fog::Kubevirt::Compute.new(
280
322
  :kubevirt_hostname => hostname,
281
323
  :kubevirt_port => api_port,
@@ -283,7 +325,8 @@ module ForemanKubevirt
283
325
  :kubevirt_token => token,
284
326
  :kubevirt_log => logger,
285
327
  :kubevirt_verify_ssl => ca_cert.present?,
286
- :kubevirt_ca_cert => ca_cert
328
+ :kubevirt_ca_cert => ca_cert,
329
+ :kubevirt_version => "v1alpha3"
287
330
  )
288
331
  rescue OpenSSL::X509::CertificateError
289
332
  raise_certification_failure_exception
@@ -332,19 +375,24 @@ module ForemanKubevirt
332
375
  end
333
376
 
334
377
  def validate_volume_capacity(volumes_attributes)
335
- volumes_attributes.each { |_, v| raise ::Foreman::Exception.new N_('Capacity was not found') if v[:capacity].empty? }
378
+ volumes_attributes.each do |_, vol|
379
+ if vol[:capacity].to_s.empty? || /\A\d+G?\Z/.match(vol[:capacity].to_s).nil?
380
+ raise Foreman::Exception.new(N_("Volume size #{vol[:capacity]} is not valid"))
381
+ end
382
+ end
336
383
  end
337
384
 
338
385
  def validate_only_single_bootable_volume(volumes_attributes)
339
- raise ::Foreman::Exception.new N_('Only one volume can be bootable') if volumes_attributes.select { |_, v| v[:bootable] == "true" }.count > 1
386
+ raise ::Foreman::Exception.new N_('Only one volume can be bootable') if volumes_attributes.count { |_, v| v[:bootable] == "true" } > 1
340
387
  end
341
388
 
342
389
  def create_new_pvc(pvc_name, capacity, storage_class)
390
+ capacity = capacity + "G" unless capacity.end_with? "G"
343
391
  client.pvcs.create(:name => pvc_name,
344
392
  :namespace => namespace,
345
393
  :storage_class => storage_class,
346
394
  :access_modes => ['ReadWriteOnce'],
347
- :requests => { :storage => capacity + "G" })
395
+ :requests => { :storage => capacity })
348
396
  end
349
397
 
350
398
  def delete_pvcs(volumes)
@@ -421,8 +469,8 @@ module ForemanKubevirt
421
469
  def create_network_devices_for_vm(options, volumes)
422
470
  interfaces = []
423
471
  networks = []
424
-
425
472
  options[:interfaces_attributes].values.each do |iface|
473
+ raise ::Foreman::Exception.new N_('cni_provider or network are missing') unless (iface.key?(:cni_provider) && iface.key?(:network))
426
474
  if iface[:cni_provider] == 'pod'
427
475
  nic, net = create_pod_network_element
428
476
  else
@@ -0,0 +1,13 @@
1
+ class VolumeValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ if value[:volumes_attributes].present?
4
+ value[:volumes_attributes].each do |_, attrs|
5
+ if attrs.key?("capacity") && attrs.key?("storage_class")
6
+ if attrs["capacity"].to_s.empty? || /\A\d+G?\Z/.match(attrs["capacity"].to_s).nil?
7
+ record.errors.add(attribute, _("Volume size #{attrs['capacity']} is not valid"))
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,11 +1,13 @@
1
- <%= text_f f, :hostname, :label => _("Hostname") %>
1
+ <%= text_f f, :hostname, :label => _("Hostname"), :required => true %>
2
2
  <%= text_f f, :api_port, :label => _("API Port"), :required => true %>
3
3
  <%= text_f f, :namespace, :label => _("Namespace"), :required => true %>
4
- <%= password_f f, :password, :label => _("Token"), :required => true,
4
+ <%= password_f f, :token, :label => _("Token"), :required => true,
5
5
  :keep_value => true, :unset => unset_password?,
6
6
  :help_block => _("e.g. eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9..."),
7
7
  :help_inline => documentation_button('/foreman_kubevirt/0.x/index.html#4.1SettingComputeResourceTokenandX509CAvalues',
8
- root_url: 'https://theforeman.org/plugins') %>
8
+ :root_url => 'https://theforeman.org/plugins'),
9
+ :id => "compute_resource_password"
10
+ %>
9
11
 
10
12
  <%= textarea_f f, :ca_cert, :label => _("X509 Certification Authorities"),
11
13
  :placeholder => _("Optionally provide a CA, or a correctly ordered CA chain or a path to a file. If left blank - insecure.") %>
@@ -1,6 +1,10 @@
1
1
  <% if f.object.type.nil? || f.object.type == 'persistentVolumeClaim' %>
2
+ <% if @set %>
3
+ <% @set.errors[:vm_attrs].each do | error| %>
4
+ <%= alert :class => 'alert-danger', :header => '', :text => error %>
5
+ <% end %>
6
+ <% end %>
2
7
  <% storage_classes = compute_resource.storage_classes %>
3
-
4
8
  <%= select_f f, :storage_class,
5
9
  compute_resource.storage_classes_for_select,
6
10
  :id,
@@ -10,7 +14,6 @@
10
14
  :label_size => "col-md-2",
11
15
  :disabled => !new_vm,
12
16
  :class => "col-md-2" %>
13
-
14
17
  <%= text_f f,:capacity, :label => _('Size (GB)'), :label_size => "col-md-2", :disabled => !new_vm, :class => "col-md-2 pvc-size" %>
15
18
 
16
19
  <% bootable = f.object.boot_order.nil? ? false : f.object.bootable %>
@@ -62,6 +62,8 @@ module ForemanKubevirt
62
62
  require "fog/kubevirt/compute/models/networkattachmentdef"
63
63
  require File.expand_path("../../app/models/concerns/fog_extensions/kubevirt/network", __dir__)
64
64
  Fog::Kubevirt::Compute::Networkattachmentdef.send(:include, ::FogExtensions::Kubevirt::Network)
65
+ ComputeAttribute.send :include, ForemanKubevirt::ComputeAttributeExtensions
66
+
65
67
  rescue StandardError => e
66
68
  Rails.logger.warn "Foreman-Kubevirt: skipping engine hook (#{e})"
67
69
  end
@@ -1,3 +1,3 @@
1
1
  module ForemanKubevirt
2
- VERSION = '0.1.3'.freeze
2
+ VERSION = '0.1.9'.freeze
3
3
  end
@@ -0,0 +1,5 @@
1
+ # Autogenerated!
2
+ _("Action with sub plans")
3
+ _("Import facts")
4
+ _("Import Puppet classes")
5
+ _("Remote action:")
@@ -0,0 +1,170 @@
1
+ # Catalan translations for foreman_kubevirt package.
2
+ # Copyright (C) 2020 THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the foreman_kubevirt package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: foreman_kubevirt 1.0.0\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "PO-Revision-Date: 2020-05-26 13:16+0530\n"
11
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12
+ "Language-Team: Catalan\n"
13
+ "Language: ca\n"
14
+ "MIME-Version: 1.0\n"
15
+ "Content-Type: text/plain; charset=UTF-8\n"
16
+ "Content-Transfer-Encoding: 8bit\n"
17
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
18
+ "\n"
19
+
20
+ msgid "%{cpu_cores} Cores and %{memory} memory"
21
+ msgstr ""
22
+
23
+ msgid "API Port"
24
+ msgstr ""
25
+
26
+ msgid "API port for KubeVirt only"
27
+ msgstr ""
28
+
29
+ msgid "Actions"
30
+ msgstr ""
31
+
32
+ msgid "Bootable"
33
+ msgstr ""
34
+
35
+ msgid "CA crt for KubeVirt only"
36
+ msgstr ""
37
+
38
+ msgid "CNI Provider"
39
+ msgstr ""
40
+
41
+ msgid "CPUs"
42
+ msgstr ""
43
+
44
+ msgid "Disk"
45
+ msgstr ""
46
+
47
+ msgid "Does this image support user data input (e.g. via cloud-init)?"
48
+ msgstr ""
49
+
50
+ msgid "Host name for KubeVirt only"
51
+ msgstr ""
52
+
53
+ msgid "Hostname"
54
+ msgstr ""
55
+
56
+ msgid "Image"
57
+ msgstr ""
58
+
59
+ msgid "It is not possible to set a bootable volume and image based provisioning."
60
+ msgstr ""
61
+
62
+ msgid "Memory"
63
+ msgstr ""
64
+
65
+ msgid "NIC"
66
+ msgstr ""
67
+
68
+ msgid "Name"
69
+ msgstr ""
70
+
71
+ msgid "Namespace"
72
+ msgstr ""
73
+
74
+ msgid "Namespace for KubeVirt only"
75
+ msgstr ""
76
+
77
+ msgid "Network"
78
+ msgstr ""
79
+
80
+ msgid "Only one volume can be bootable"
81
+ msgstr ""
82
+
83
+ msgid "Optionally provide a CA, or a correctly ordered CA chain or a path to a file. If left blank - insecure."
84
+ msgstr ""
85
+
86
+ msgid "Password to authenticate with - used for SSH finish step."
87
+ msgstr ""
88
+
89
+ msgid "Please select an image"
90
+ msgstr ""
91
+
92
+ msgid "Power"
93
+ msgstr ""
94
+
95
+ msgid "Power ON this machine"
96
+ msgstr ""
97
+
98
+ msgid "Properties"
99
+ msgstr ""
100
+
101
+ msgid "Provision and manage Kubevirt Virtual Machines from Foreman."
102
+ msgstr ""
103
+
104
+ msgid "Running on"
105
+ msgstr ""
106
+
107
+ msgid "Size (GB)"
108
+ msgstr ""
109
+
110
+ msgid "Start"
111
+ msgstr ""
112
+
113
+ msgid "Storage Class"
114
+ msgstr ""
115
+
116
+ msgid "The compute resource could not be authenticated"
117
+ msgstr ""
118
+
119
+ msgid "The name of the image in the registry."
120
+ msgstr ""
121
+
122
+ msgid ""
123
+ "The remote system presented a public key signed by an unidentified certificate authority.\n"
124
+ " If you are sure the remote system is authentic, go to the compute resource edit page, press the 'Test Connection' button and submit"
125
+ msgstr ""
126
+
127
+ msgid "The user that is used to ssh into the instance, normally cloud-user, ec2-user, ubuntu, root etc"
128
+ msgstr ""
129
+
130
+ msgid "Token"
131
+ msgstr ""
132
+
133
+ msgid "Token for KubeVirt only"
134
+ msgstr ""
135
+
136
+ msgid "Type"
137
+ msgstr ""
138
+
139
+ msgid "UUID"
140
+ msgstr ""
141
+
142
+ msgid "VCPU(s)"
143
+ msgstr ""
144
+
145
+ msgid "VM should be created based on Persistent Volume Claim or Image"
146
+ msgstr ""
147
+
148
+ msgid "VM should be created based on an image"
149
+ msgstr ""
150
+
151
+ msgid "X509 Certification Authorities"
152
+ msgstr ""
153
+
154
+ msgid "cni_provider or network are missing"
155
+ msgstr ""
156
+
157
+ msgid "e.g. eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9..."
158
+ msgstr ""
159
+
160
+ msgid "genie"
161
+ msgstr ""
162
+
163
+ msgid "multus"
164
+ msgstr ""
165
+
166
+ msgid "no Storage Classes available on provider"
167
+ msgstr ""
168
+
169
+ msgid "pod"
170
+ msgstr ""