vagrant-openstack-illuin-provider 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rubocop.yml +40 -0
  4. data/CHANGELOG.md +282 -0
  5. data/Gemfile +18 -0
  6. data/RELEASE.md +15 -0
  7. data/Rakefile +25 -0
  8. data/Vagrantfile +20 -0
  9. data/dummy.box +0 -0
  10. data/example_box/README.md +13 -0
  11. data/example_box/metadata.json +3 -0
  12. data/functional_tests/Vagrantfile +58 -0
  13. data/functional_tests/keys/vagrant-openstack +27 -0
  14. data/functional_tests/keys/vagrant-openstack.pub +1 -0
  15. data/functional_tests/run_tests.sh +142 -0
  16. data/lib/vagrant-openstack-illuin-provider.rb +29 -0
  17. data/lib/vagrant-openstack-illuin-provider/action.rb +344 -0
  18. data/lib/vagrant-openstack-illuin-provider/action/abstract_action.rb +22 -0
  19. data/lib/vagrant-openstack-illuin-provider/action/connect_openstack.rb +60 -0
  20. data/lib/vagrant-openstack-illuin-provider/action/create_server.rb +187 -0
  21. data/lib/vagrant-openstack-illuin-provider/action/create_stack.rb +76 -0
  22. data/lib/vagrant-openstack-illuin-provider/action/delete_server.rb +53 -0
  23. data/lib/vagrant-openstack-illuin-provider/action/delete_stack.rb +73 -0
  24. data/lib/vagrant-openstack-illuin-provider/action/message.rb +19 -0
  25. data/lib/vagrant-openstack-illuin-provider/action/provision.rb +60 -0
  26. data/lib/vagrant-openstack-illuin-provider/action/read_ssh_info.rb +74 -0
  27. data/lib/vagrant-openstack-illuin-provider/action/read_state.rb +43 -0
  28. data/lib/vagrant-openstack-illuin-provider/action/resume.rb +24 -0
  29. data/lib/vagrant-openstack-illuin-provider/action/snapshot_cleanup.rb +32 -0
  30. data/lib/vagrant-openstack-illuin-provider/action/snapshot_delete.rb +32 -0
  31. data/lib/vagrant-openstack-illuin-provider/action/snapshot_list.rb +22 -0
  32. data/lib/vagrant-openstack-illuin-provider/action/snapshot_restore.rb +29 -0
  33. data/lib/vagrant-openstack-illuin-provider/action/snapshot_save.rb +51 -0
  34. data/lib/vagrant-openstack-illuin-provider/action/start_server.rb +24 -0
  35. data/lib/vagrant-openstack-illuin-provider/action/stop_server.rb +25 -0
  36. data/lib/vagrant-openstack-illuin-provider/action/suspend.rb +24 -0
  37. data/lib/vagrant-openstack-illuin-provider/action/sync_folders.rb +138 -0
  38. data/lib/vagrant-openstack-illuin-provider/action/wait_active.rb +33 -0
  39. data/lib/vagrant-openstack-illuin-provider/action/wait_stop.rb +33 -0
  40. data/lib/vagrant-openstack-illuin-provider/cap/snapshot_list.rb +15 -0
  41. data/lib/vagrant-openstack-illuin-provider/catalog/openstack_catalog.rb +90 -0
  42. data/lib/vagrant-openstack-illuin-provider/client/cinder.rb +39 -0
  43. data/lib/vagrant-openstack-illuin-provider/client/domain.rb +163 -0
  44. data/lib/vagrant-openstack-illuin-provider/client/glance.rb +65 -0
  45. data/lib/vagrant-openstack-illuin-provider/client/heat.rb +49 -0
  46. data/lib/vagrant-openstack-illuin-provider/client/http_utils.rb +116 -0
  47. data/lib/vagrant-openstack-illuin-provider/client/keystone.rb +128 -0
  48. data/lib/vagrant-openstack-illuin-provider/client/neutron.rb +48 -0
  49. data/lib/vagrant-openstack-illuin-provider/client/nova.rb +303 -0
  50. data/lib/vagrant-openstack-illuin-provider/client/openstack.rb +59 -0
  51. data/lib/vagrant-openstack-illuin-provider/client/request_logger.rb +23 -0
  52. data/lib/vagrant-openstack-illuin-provider/client/rest_utils.rb +28 -0
  53. data/lib/vagrant-openstack-illuin-provider/command/abstract_command.rb +51 -0
  54. data/lib/vagrant-openstack-illuin-provider/command/flavor_list.rb +24 -0
  55. data/lib/vagrant-openstack-illuin-provider/command/floatingip_list.rb +32 -0
  56. data/lib/vagrant-openstack-illuin-provider/command/image_list.rb +29 -0
  57. data/lib/vagrant-openstack-illuin-provider/command/main.rb +52 -0
  58. data/lib/vagrant-openstack-illuin-provider/command/network_list.rb +25 -0
  59. data/lib/vagrant-openstack-illuin-provider/command/openstack_command.rb +16 -0
  60. data/lib/vagrant-openstack-illuin-provider/command/reset.rb +20 -0
  61. data/lib/vagrant-openstack-illuin-provider/command/subnet_list.rb +22 -0
  62. data/lib/vagrant-openstack-illuin-provider/command/utils.rb +22 -0
  63. data/lib/vagrant-openstack-illuin-provider/command/volume_list.rb +25 -0
  64. data/lib/vagrant-openstack-illuin-provider/config.rb +505 -0
  65. data/lib/vagrant-openstack-illuin-provider/config/http.rb +39 -0
  66. data/lib/vagrant-openstack-illuin-provider/config_resolver.rb +334 -0
  67. data/lib/vagrant-openstack-illuin-provider/errors.rb +187 -0
  68. data/lib/vagrant-openstack-illuin-provider/logging.rb +39 -0
  69. data/lib/vagrant-openstack-illuin-provider/plugin.rb +58 -0
  70. data/lib/vagrant-openstack-illuin-provider/provider.rb +50 -0
  71. data/lib/vagrant-openstack-illuin-provider/utils.rb +81 -0
  72. data/lib/vagrant-openstack-illuin-provider/version.rb +15 -0
  73. data/lib/vagrant-openstack-illuin-provider/version_checker.rb +76 -0
  74. data/locales/en.yml +412 -0
  75. data/spec/vagrant-openstack-illuin-provider/action/connect_openstack_spec.rb +770 -0
  76. data/spec/vagrant-openstack-illuin-provider/action/create_server_spec.rb +260 -0
  77. data/spec/vagrant-openstack-illuin-provider/action/create_stack_spec.rb +99 -0
  78. data/spec/vagrant-openstack-illuin-provider/action/delete_server_spec.rb +89 -0
  79. data/spec/vagrant-openstack-illuin-provider/action/delete_stack_spec.rb +63 -0
  80. data/spec/vagrant-openstack-illuin-provider/action/message_spec.rb +33 -0
  81. data/spec/vagrant-openstack-illuin-provider/action/provision_spec.rb +97 -0
  82. data/spec/vagrant-openstack-illuin-provider/action/read_ssh_info_spec.rb +202 -0
  83. data/spec/vagrant-openstack-illuin-provider/action/read_state_spec.rb +81 -0
  84. data/spec/vagrant-openstack-illuin-provider/action/resume_server_spec.rb +49 -0
  85. data/spec/vagrant-openstack-illuin-provider/action/start_server_spec.rb +49 -0
  86. data/spec/vagrant-openstack-illuin-provider/action/stop_server_spec.rb +49 -0
  87. data/spec/vagrant-openstack-illuin-provider/action/suspend_server_spec.rb +49 -0
  88. data/spec/vagrant-openstack-illuin-provider/action/sync_folders_spec.rb +155 -0
  89. data/spec/vagrant-openstack-illuin-provider/action/wait_active_spec.rb +53 -0
  90. data/spec/vagrant-openstack-illuin-provider/action/wait_stop_spec.rb +53 -0
  91. data/spec/vagrant-openstack-illuin-provider/action_spec.rb +120 -0
  92. data/spec/vagrant-openstack-illuin-provider/client/cinder_spec.rb +129 -0
  93. data/spec/vagrant-openstack-illuin-provider/client/glance_spec.rb +145 -0
  94. data/spec/vagrant-openstack-illuin-provider/client/heat_spec.rb +130 -0
  95. data/spec/vagrant-openstack-illuin-provider/client/keystone_spec.rb +226 -0
  96. data/spec/vagrant-openstack-illuin-provider/client/neutron_spec.rb +173 -0
  97. data/spec/vagrant-openstack-illuin-provider/client/nova_spec.rb +760 -0
  98. data/spec/vagrant-openstack-illuin-provider/client/utils_spec.rb +176 -0
  99. data/spec/vagrant-openstack-illuin-provider/command/flavor_list_spec.rb +43 -0
  100. data/spec/vagrant-openstack-illuin-provider/command/floatingip_list_spec.rb +74 -0
  101. data/spec/vagrant-openstack-illuin-provider/command/image_list_spec.rb +95 -0
  102. data/spec/vagrant-openstack-illuin-provider/command/network_list_spec.rb +65 -0
  103. data/spec/vagrant-openstack-illuin-provider/command/reset_spec.rb +24 -0
  104. data/spec/vagrant-openstack-illuin-provider/command/subnet_list_spec.rb +45 -0
  105. data/spec/vagrant-openstack-illuin-provider/command/volume_list_spec.rb +40 -0
  106. data/spec/vagrant-openstack-illuin-provider/config_resolver_spec.rb +879 -0
  107. data/spec/vagrant-openstack-illuin-provider/config_spec.rb +416 -0
  108. data/spec/vagrant-openstack-illuin-provider/e2e_spec.rb.save +27 -0
  109. data/spec/vagrant-openstack-illuin-provider/provider_spec.rb +13 -0
  110. data/spec/vagrant-openstack-illuin-provider/spec_helper.rb +37 -0
  111. data/spec/vagrant-openstack-illuin-provider/utils_spec.rb +197 -0
  112. data/spec/vagrant-openstack-illuin-provider/version_checker_spec.rb +39 -0
  113. data/stackrc +25 -0
  114. data/vagrant-openstack-illuin-provider.gemspec +35 -0
  115. metadata +379 -0
@@ -0,0 +1,505 @@
1
+ require 'vagrant'
2
+ require 'colorize'
3
+ require 'vagrant-openstack-illuin-provider/config/http'
4
+
5
+ module VagrantPlugins
6
+ module Openstack
7
+ class Config < Vagrant.plugin('2', :config)
8
+ # The API key to access Openstack.
9
+ #
10
+ attr_accessor :password
11
+
12
+ # The compute service url to access Openstack. If nil, it will read from hypermedia catalog form REST API
13
+ #
14
+ attr_accessor :openstack_compute_url
15
+
16
+ # The network service url to access Openstack. If nil, it will read from hypermedia catalog form REST API
17
+ #
18
+ attr_accessor :openstack_network_url
19
+
20
+ # The block storage service url to access Openstack. If nil, it will read from hypermedia catalog form REST API
21
+ #
22
+ attr_accessor :openstack_volume_url
23
+
24
+ # The orchestration service url to access Openstack. If nil, it will read from hypermedia catalog form REST API
25
+ #
26
+ attr_accessor :openstack_orchestration_url
27
+
28
+ # The image service url to access Openstack. If nil, it will read from hypermedia catalog form REST API
29
+ #
30
+ attr_accessor :openstack_image_url
31
+
32
+ # The authentication endpoint. This defaults to Openstack's global authentication endpoint.
33
+ attr_accessor :openstack_auth_url
34
+
35
+ # Openstack region
36
+ attr_accessor :region
37
+
38
+ # The flavor of server to launch, either the ID or name. This
39
+ # can also be a regular expression to partially match a name.
40
+ attr_accessor :flavor
41
+
42
+ # The name or ID of the image to use. This can also be a regular
43
+ # expression to partially match a name.
44
+ attr_accessor :image
45
+
46
+ # Volume to boot the vm from
47
+ #
48
+ attr_accessor :volume_boot
49
+
50
+ #
51
+ # The name of the openstack project on witch the vm will be created.
52
+ #
53
+ attr_accessor :tenant_name
54
+
55
+ #
56
+ # The name of the openstack project on witch the vm will be created, changed name in v3 identity API.
57
+ #
58
+ attr_accessor :project_name
59
+
60
+ # The name of the server. This defaults to the name of the machine
61
+ # defined by Vagrant (via `config.vm.define`), but can be overriden
62
+ # here.
63
+ attr_accessor :server_name
64
+
65
+ # The username to access Openstack.
66
+ #
67
+ # @return [String]
68
+ attr_accessor :username
69
+
70
+ # The domain name to access Openstack, this defaults to Default.
71
+ #
72
+ # @return [String]
73
+ attr_accessor :domain_name
74
+
75
+ # The name of the keypair to use.
76
+ #
77
+ # @return [String]
78
+ attr_accessor :keypair_name
79
+
80
+ # The SSH username to use with this OpenStack instance. This overrides
81
+ # the `config.ssh.username` variable.
82
+ #
83
+ # @return [String]
84
+ attr_accessor :ssh_username
85
+
86
+ # The SSH timeout use after server creation.
87
+ #
88
+ # Deprecated. Use config.vm.boot_timeout instead.
89
+ #
90
+ # @return [Integer]
91
+ attr_accessor :ssh_timeout
92
+
93
+ # Opt files/directories in to the rsync operation performed by this provider
94
+ #
95
+ # @deprecated Use standard Vagrant synced folders instead.
96
+ #
97
+ # @return [Array]
98
+ attr_accessor :rsync_includes
99
+
100
+ # The floating IP address from the IP pool which will be assigned to the instance.
101
+ #
102
+ # @return [String]
103
+ attr_accessor :floating_ip
104
+
105
+ # The floating IP pool from where new IPs will be allocated
106
+ #
107
+ # @return [String]
108
+ attr_accessor :floating_ip_pool
109
+
110
+ # if set to true, vagrant will always allocate floating ip instead of trying to reuse unassigned ones
111
+ # default to false
112
+ #
113
+ # @return [Boolean]
114
+ attr_accessor :floating_ip_pool_always_allocate
115
+
116
+ # Sync folder method. Can be either "rsync" or "none"
117
+ #
118
+ # @deprecated Use standard Vagrant synced folders instead.
119
+ #
120
+ # @return [String]
121
+ attr_accessor :sync_method
122
+
123
+ # Sync folder ignore files. A list of files containing exclude patterns to ignore in the rsync operation
124
+ # performed by this provider
125
+ #
126
+ # @deprecated Use standard Vagrant synced folders instead.
127
+ #
128
+ # @return [Array]
129
+ attr_accessor :rsync_ignore_files
130
+
131
+ # Network list the VM will be connected to
132
+ #
133
+ # @return [Array]
134
+ attr_accessor :networks
135
+
136
+ # Volumes list that will be attached to the VM
137
+ #
138
+ # @return [Array]
139
+ attr_accessor :volumes
140
+
141
+ # Stack that will be created and associated to the instances
142
+ #
143
+ # @return [Array]
144
+ attr_accessor :stacks
145
+
146
+ # Public key path to create OpenStack keypair
147
+ #
148
+ # @return [Array]
149
+ attr_accessor :public_key_path
150
+
151
+ # Availability Zone
152
+ #
153
+ # @return [String]
154
+ attr_accessor :availability_zone
155
+
156
+ # Pass hints to the OpenStack scheduler, e.g. { "cell": "some cell name" }
157
+ attr_accessor :scheduler_hints
158
+
159
+ # List of strings representing the security groups to apply.
160
+ # e.g. ['ssh', 'http']
161
+ #
162
+ # @return [Array[String]]
163
+ attr_accessor :security_groups
164
+
165
+ # User data to be sent to the newly created OpenStack instance. Use this
166
+ # e.g. to inject a script at boot time.
167
+ #
168
+ # @return [String]
169
+ attr_accessor :user_data
170
+
171
+ # A Hash of metadata that will be sent to the instance for configuration
172
+ #
173
+ # @return [Hash]
174
+ attr_accessor :metadata
175
+
176
+ # Flag to enable/disable all SSH actions (to use for instance on private networks)
177
+ #
178
+ # @return [Boolean]
179
+ attr_accessor :ssh_disabled
180
+
181
+ # Specify the endpoint_type to use : publicURL, adminURL, or internalURL (default is publicURL)
182
+ #
183
+ # @return [String]
184
+ attr_accessor :endpoint_type
185
+
186
+ # Specify the endpoint_type to use : publicL, admin, or internal (default is public)
187
+ #
188
+ # @return [String]
189
+ attr_accessor :interface_type
190
+
191
+ # Specify the authentication version to use : 2 or 3 (ddefault is 2()
192
+ #
193
+ # @return [String]
194
+ attr_accessor :identity_api_version
195
+
196
+ #
197
+ # @return [Integer]
198
+ attr_accessor :server_create_timeout
199
+
200
+ #
201
+ # @return [Integer]
202
+ attr_accessor :server_active_timeout
203
+
204
+ #
205
+ # @return [Integer]
206
+ attr_accessor :server_stop_timeout
207
+
208
+ #
209
+ # @return [Integer]
210
+ attr_accessor :server_delete_timeout
211
+
212
+ #
213
+ # @return [Integer]
214
+ attr_accessor :stack_create_timeout
215
+
216
+ #
217
+ # @return [Integer]
218
+ attr_accessor :stack_delete_timeout
219
+
220
+ #
221
+ # @return [Integer]
222
+ attr_accessor :floating_ip_assign_timeout
223
+
224
+ #
225
+ # @return [HttpConfig]
226
+ attr_accessor :http
227
+
228
+ #
229
+ # @return [Boolean]
230
+ attr_accessor :meta_args_support
231
+
232
+ # A switch for enabling the legacy synced folders implementation.
233
+ #
234
+ # This defaults to false, but is automatically set to true if any of the
235
+ # legacy synced folder options are used:
236
+ #
237
+ # - {#rsync_includes}
238
+ # - {#rsync_ignore_files}
239
+ # - {#sync_method}
240
+ #
241
+ # @deprecated Use standard Vagrant synced folders instead.
242
+ #
243
+ # @return [Boolean]
244
+ attr_accessor :use_legacy_synced_folders
245
+
246
+ # Specify the certificate to use.
247
+ #
248
+ # @return [String]
249
+ attr_accessor :ssl_ca_file
250
+
251
+ # Verify ssl peer certificate when connecting. Set to false (! unsecure) to disable
252
+ #
253
+ # @return [Boolean]
254
+ attr_accessor :ssl_verify_peer
255
+
256
+ # Specify the version of ip that should be used to connect to the machine
257
+ #
258
+ # @return [Integer]
259
+ attr_accessor :ip_version
260
+
261
+ def initialize
262
+ @password = UNSET_VALUE
263
+ @openstack_compute_url = UNSET_VALUE
264
+ @openstack_network_url = UNSET_VALUE
265
+ @openstack_volume_url = UNSET_VALUE
266
+ @openstack_orchestration_url = UNSET_VALUE
267
+ @openstack_image_url = UNSET_VALUE
268
+ @openstack_auth_url = UNSET_VALUE
269
+ @endpoint_type = UNSET_VALUE
270
+ @interface_type = UNSET_VALUE
271
+ @identity_api_version = UNSET_VALUE
272
+ @region = UNSET_VALUE
273
+ @flavor = UNSET_VALUE
274
+ @image = UNSET_VALUE
275
+ @volume_boot = UNSET_VALUE
276
+ @tenant_name = UNSET_VALUE
277
+ @server_name = UNSET_VALUE
278
+ @username = UNSET_VALUE
279
+ @rsync_includes = []
280
+ @rsync_ignore_files = []
281
+ @keypair_name = UNSET_VALUE
282
+ @ssh_username = UNSET_VALUE
283
+ @ssh_timeout = UNSET_VALUE
284
+ @floating_ip = UNSET_VALUE
285
+ @floating_ip_pool = []
286
+ @floating_ip_pool_always_allocate = UNSET_VALUE
287
+ @sync_method = UNSET_VALUE
288
+ @availability_zone = UNSET_VALUE
289
+ @networks = []
290
+ @stacks = []
291
+ @volumes = []
292
+ @public_key_path = UNSET_VALUE
293
+ @scheduler_hints = UNSET_VALUE
294
+ @security_groups = UNSET_VALUE
295
+ @user_data = UNSET_VALUE
296
+ @metadata = UNSET_VALUE
297
+ @ssh_disabled = UNSET_VALUE
298
+ @server_create_timeout = UNSET_VALUE
299
+ @server_active_timeout = UNSET_VALUE
300
+ @server_stop_timeout = UNSET_VALUE
301
+ @server_delete_timeout = UNSET_VALUE
302
+ @stack_create_timeout = UNSET_VALUE
303
+ @stack_delete_timeout = UNSET_VALUE
304
+ @floating_ip_assign_timeout = UNSET_VALUE
305
+ @meta_args_support = UNSET_VALUE
306
+ @http = HttpConfig.new
307
+ @use_legacy_synced_folders = UNSET_VALUE
308
+ @ssl_ca_file = UNSET_VALUE
309
+ @ssl_verify_peer = UNSET_VALUE
310
+ @ip_version = UNSET_VALUE
311
+ end
312
+
313
+ def merge(other)
314
+ result = self.class.new
315
+
316
+ # Set all of our instance variables on the new class
317
+ [self, other].each do |obj|
318
+ obj.instance_variables.each do |key|
319
+ # Ignore keys that start with a double underscore. This allows
320
+ # configuration classes to still hold around internal state
321
+ # that isn't propagated.
322
+ next if key.to_s.start_with?('@__')
323
+
324
+ # Let user inputs a string or an array for floating ip pool attribute
325
+ obj.floating_ip_pool = [obj.floating_ip_pool].flatten if key.eql?(:@floating_ip_pool) && !obj.floating_ip_pool.nil?
326
+
327
+ # Let user inputs a string or an array for networks attribute
328
+ obj.networks = [obj.networks].flatten if key.eql?(:@networks) && !obj.networks.nil?
329
+
330
+ # Don't set the value if it is the unset value, either.
331
+ value = obj.instance_variable_get(key)
332
+
333
+ if [:@networks, :@volumes, :@rsync_includes, :@rsync_ignore_files, :@floating_ip_pool, :@stacks].include? key
334
+ result.instance_variable_set(key, value) unless value.empty?
335
+ elsif [:@http].include? key
336
+ result.instance_variable_set(key, instance_variable_get(key).merge(other.instance_variable_get(key))) if value != UNSET_VALUE
337
+ else
338
+ result.instance_variable_set(key, value) if value != UNSET_VALUE
339
+ end
340
+ end
341
+ end
342
+
343
+ # Persist through the set of invalid methods
344
+ this_invalid = @__invalid_methods || Set.new
345
+ other_invalid = other.instance_variable_get(:"@__invalid_methods") || Set.new
346
+ result.instance_variable_set(:"@__invalid_methods", this_invalid + other_invalid)
347
+
348
+ result
349
+ end
350
+
351
+ # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
352
+ def finalize!
353
+ @password = nil if @password == UNSET_VALUE
354
+ @openstack_compute_url = nil if @openstack_compute_url == UNSET_VALUE
355
+ @openstack_network_url = nil if @openstack_network_url == UNSET_VALUE
356
+ @openstack_orchestration_url = nil if @openstack_orchestration_url == UNSET_VALUE
357
+ @openstack_volume_url = nil if @openstack_volume_url == UNSET_VALUE
358
+ @openstack_image_url = nil if @openstack_image_url == UNSET_VALUE
359
+ @openstack_auth_url = nil if @openstack_auth_url == UNSET_VALUE
360
+ @endpoint_type = 'publicURL' if @endpoint_type == UNSET_VALUE
361
+ @interface_type = 'public' if @interface_type == UNSET_VALUE
362
+ @identity_api_version = '2' if @identity_api_version == UNSET_VALUE
363
+ @region = nil if @region == UNSET_VALUE
364
+ @flavor = nil if @flavor == UNSET_VALUE
365
+ @image = nil if @image == UNSET_VALUE
366
+ @volume_boot = nil if @volume_boot == UNSET_VALUE
367
+ @tenant_name = nil if @tenant_name == UNSET_VALUE
368
+ @project_name = nil if @project_name == UNSET_VALUE
369
+ @server_name = nil if @server_name == UNSET_VALUE
370
+ @username = nil if @username == UNSET_VALUE
371
+ @domain_name = 'Default' if @domain_name == UNSET_VALUE
372
+ @floating_ip = nil if @floating_ip == UNSET_VALUE
373
+ @floating_ip_pool = nil if @floating_ip_pool == UNSET_VALUE
374
+ @floating_ip_pool_always_allocate = false if floating_ip_pool_always_allocate == UNSET_VALUE
375
+ @keypair_name = nil if @keypair_name == UNSET_VALUE
376
+ @public_key_path = nil if @public_key_path == UNSET_VALUE
377
+ @availability_zone = nil if @availability_zone == UNSET_VALUE
378
+ @scheduler_hints = nil if @scheduler_hints == UNSET_VALUE
379
+ @security_groups = nil if @security_groups == UNSET_VALUE
380
+ @user_data = nil if @user_data == UNSET_VALUE
381
+ @metadata = nil if @metadata == UNSET_VALUE
382
+ @ssh_disabled = false if @ssh_disabled == UNSET_VALUE
383
+ @ip_version = nil if @ip_version == UNSET_VALUE
384
+
385
+ # The value of use_legacy_synced_folders is used by action chains
386
+ # to determine which synced folder implementation to run.
387
+ if @use_legacy_synced_folders == UNSET_VALUE
388
+ @use_legacy_synced_folders = !(
389
+ (@rsync_includes.nil? || @rsync_includes.empty?) &&
390
+ (@rsync_ignore_files.nil? || @rsync_ignore_files.empty?) &&
391
+ (@sync_method.nil? || @sync_method == UNSET_VALUE))
392
+ end
393
+
394
+ if @use_legacy_synced_folders
395
+ # Original defaults.
396
+ @rsync_includes = nil if @rsync_includes.empty?
397
+ @rsync_ignore_files = nil if @rsync_ignore_files.empty?
398
+ @sync_method = 'rsync' if @sync_method == UNSET_VALUE
399
+ else
400
+ # Disable all sync settings.
401
+ @rsync_includes = nil
402
+ @rsync_ignore_files = nil
403
+ @sync_method = nil
404
+ end
405
+
406
+ # The SSH values by default are nil, and the top-level config
407
+ # `config.ssh` and `config.vm.boot_timeout` values are used.
408
+ @ssh_username = nil if @ssh_username == UNSET_VALUE
409
+ @ssh_timeout = nil if @ssh_timeout == UNSET_VALUE
410
+
411
+ @server_create_timeout = 200 if @server_create_timeout == UNSET_VALUE
412
+ @server_active_timeout = 200 if @server_active_timeout == UNSET_VALUE
413
+ @server_stop_timeout = 200 if @server_stop_timeout == UNSET_VALUE
414
+ @server_delete_timeout = 200 if @server_delete_timeout == UNSET_VALUE
415
+ @stack_create_timeout = 200 if @stack_create_timeout == UNSET_VALUE
416
+ @stack_delete_timeout = 200 if @stack_delete_timeout == UNSET_VALUE
417
+ @floating_ip_assign_timeout = 200 if @floating_ip_assign_timeout == UNSET_VALUE
418
+ @meta_args_support = false if @meta_args_support == UNSET_VALUE
419
+ @networks = nil if @networks.empty?
420
+ @volumes = nil if @volumes.empty?
421
+ @stacks = nil if @stacks.empty?
422
+ @http.finalize!
423
+ @ssl_ca_file = nil if @ssl_ca_file == UNSET_VALUE
424
+ @ssl_verify_peer = true if @ssl_verify_peer == UNSET_VALUE
425
+ end
426
+ # rubocop:enable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
427
+
428
+ #
429
+ # @deprecated Use standard Vagrant synced folders instead.
430
+ def rsync_include(inc)
431
+ @rsync_includes << inc
432
+ end
433
+
434
+ def validate(machine)
435
+ errors = _detected_errors
436
+
437
+ errors << I18n.t('vagrant_openstack.config.password_required') if @password.nil? || @password.empty?
438
+ errors << I18n.t('vagrant_openstack.config.username_required') if @username.nil? || @username.empty?
439
+ errors << I18n.t('vagrant_openstack.config.invalid_api_version') unless %w(2 3).include?(@identity_api_version)
440
+
441
+ validate_api_version(errors)
442
+ validate_ssh_username(machine, errors)
443
+ validate_stack_config(errors)
444
+ validate_ssh_timeout(errors)
445
+
446
+ if machine.config.ssh.insert_key
447
+ if machine.config.ssh.private_key_path
448
+ puts I18n.t('vagrant_openstack.config.keypair_name_required').yellow unless @keypair_name || @public_key_path
449
+ else
450
+ errors << I18n.t('vagrant_openstack.config.private_key_missing') if @keypair_name || @public_key_path
451
+ end
452
+ end
453
+
454
+ {
455
+ openstack_compute_url: @openstack_compute_url,
456
+ openstack_network_url: @openstack_network_url,
457
+ openstack_volume_url: @openstack_volume_url,
458
+ openstack_orchestration_url: @openstack_orchestration_url,
459
+ openstack_image_url: @openstack_image_url,
460
+ openstack_auth_url: @openstack_auth_url
461
+ }.each_pair do |key, value|
462
+ errors << I18n.t('vagrant_openstack.config.invalid_uri', key: key, uri: value) unless value.nil? || valid_uri?(value)
463
+ end
464
+
465
+ { 'Openstack Provider' => errors }
466
+ end
467
+
468
+ private
469
+
470
+ def validate_api_version(errors)
471
+ if @identity_api_version == '2'
472
+ errors << I18n.t('vagrant_openstack.config.tenant_name_required') if @tenant_name.nil? || @tenant_name.empty?
473
+ errors << I18n.t('vagrant_openstack.config.invalid_endpoint_type') unless %w(publicURL adminURL internalURL).include?(@endpoint_type)
474
+ elsif @identity_api_version == '3'
475
+ errors << I18n.t('vagrant_openstack.config.domain_required') if @domain_name.nil? || @domain_name.empty?
476
+ errors << I18n.t('vagrant_openstack.config.project_name_required') if @project_name.nil? || @project_name.empty?
477
+ errors << I18n.t('vagrant_openstack.config.invalid_interface_type') unless %w(public admin internal).include?(@interface_type)
478
+ end
479
+ end
480
+
481
+ def validate_stack_config(errors)
482
+ @stacks.each do |stack|
483
+ errors << I18n.t('vagrant_openstack.config.invalid_stack') unless stack[:name] && stack[:template]
484
+ end unless @stacks.nil?
485
+ end
486
+
487
+ def validate_ssh_username(machine, errors)
488
+ puts I18n.t('vagrant_openstack.config.ssh_username_deprecated').yellow if @ssh_username
489
+ errors << I18n.t('vagrant_openstack.config.ssh_username_required') unless @ssh_username || machine.config.ssh.username
490
+ end
491
+
492
+ def validate_ssh_timeout(errors)
493
+ return if @ssh_timeout.nil? || @ssh_timeout == UNSET_VALUE
494
+ @ssh_timeout = Integer(@ssh_timeout) if @ssh_timeout.is_a? String
495
+ rescue ArgumentError
496
+ errors << I18n.t('vagrant_openstack.config.invalid_value_for_parameter', parameter: 'ssh_timeout', value: @ssh_timeout)
497
+ end
498
+
499
+ def valid_uri?(value)
500
+ uri = URI.parse value
501
+ uri.is_a?(URI::HTTP)
502
+ end
503
+ end
504
+ end
505
+ end