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,39 @@
1
+ module VagrantPlugins
2
+ module Openstack
3
+ class HttpConfig
4
+ UNSET_VALUE = Vagrant.plugin('2', :config).const_get(:UNSET_VALUE)
5
+
6
+ #
7
+ # @return [Integer]
8
+ attr_accessor :open_timeout
9
+
10
+ #
11
+ # @return [Integer]
12
+ attr_accessor :read_timeout
13
+
14
+ def initialize
15
+ @open_timeout = UNSET_VALUE
16
+ @read_timeout = UNSET_VALUE
17
+ end
18
+
19
+ def finalize!
20
+ @open_timeout = 60 if @open_timeout == UNSET_VALUE
21
+ @read_timeout = 30 if @read_timeout == UNSET_VALUE
22
+ end
23
+
24
+ def merge(other)
25
+ result = self.class.new
26
+
27
+ [self, other].each do |obj|
28
+ obj.instance_variables.each do |key|
29
+ next if key.to_s.start_with?('@__')
30
+
31
+ value = obj.instance_variable_get(key)
32
+ result.instance_variable_set(key, value) if value != UNSET_VALUE
33
+ end
34
+ end
35
+ result
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,334 @@
1
+ module VagrantPlugins
2
+ module Openstack
3
+ class ConfigResolver
4
+ def initialize
5
+ @logger = Log4r::Logger.new('vagrant_openstack::action::config_resolver')
6
+ end
7
+
8
+ def resolve_ssh_port(env)
9
+ machine_config = env[:machine].config
10
+ return machine_config.ssh.port if machine_config.ssh.port
11
+ 22
12
+ end
13
+
14
+ def resolve_flavor(env)
15
+ @logger.info 'Resolving flavor'
16
+ config = env[:machine].provider_config
17
+ nova = env[:openstack_client].nova
18
+ env[:ui].info(I18n.t('vagrant_openstack.finding_flavor'))
19
+ flavors = nova.get_all_flavors(env)
20
+ @logger.info "Finding flavor matching name '#{config.flavor}'"
21
+ flavor = find_matching(flavors, config.flavor)
22
+ fail Errors::NoMatchingFlavor unless flavor
23
+ flavor
24
+ end
25
+
26
+ def resolve_image(env)
27
+ @logger.info 'Resolving image'
28
+ resolve_image_internal(env, env[:machine].provider_config.image)
29
+ end
30
+
31
+ def resolve_volume_boot_image(env)
32
+ @logger.info 'Resolving image to create a volume from'
33
+ resolve_image_internal(env, env[:machine].provider_config.volume_boot[:image])
34
+ end
35
+
36
+ def resolve_floating_ip(env)
37
+ config = env[:machine].provider_config
38
+ nova = env[:openstack_client].nova
39
+ return config.floating_ip if config.floating_ip
40
+
41
+ fail Errors::UnableToResolveFloatingIP if config.floating_ip_pool.nil? || config.floating_ip_pool.empty?
42
+
43
+ @logger.debug 'Searching for available ips'
44
+ free_ip = search_free_ip(config, nova, env)
45
+ config.floating_ip = free_ip
46
+ return free_ip unless free_ip.nil?
47
+
48
+ @logger.debug 'Allocate new ip anyway'
49
+ allocated_ip = allocate_ip(config, nova, env)
50
+ config.floating_ip = allocated_ip
51
+ return allocated_ip unless allocated_ip.nil?
52
+ end
53
+
54
+ def resolve_keypair(env)
55
+ config = env[:machine].provider_config
56
+ machine_config = env[:machine].config
57
+ nova = env[:openstack_client].nova
58
+ return nil unless machine_config.ssh.insert_key
59
+ return config.keypair_name if config.keypair_name
60
+ return nova.import_keypair_from_file(env, config.public_key_path) if config.public_key_path
61
+ generate_keypair(env)
62
+ end
63
+
64
+ def resolve_networks(env)
65
+ @logger.info 'Resolving network(s)'
66
+ config = env[:machine].provider_config
67
+ return [] if config.networks.nil? || config.networks.empty?
68
+ env[:ui].info(I18n.t('vagrant_openstack.finding_networks'))
69
+ return resolve_networks_without_network_service(env) unless env[:openstack_client].session.endpoints.key? :network
70
+
71
+ all_networks = env[:openstack_client].neutron.get_all_networks(env)
72
+ all_network_ids = all_networks.map(&:id)
73
+
74
+ networks = []
75
+ config.networks.each do |network|
76
+ networks << resolve_network(network, all_networks, all_network_ids)
77
+ end
78
+ @logger.debug("Resolved networks : #{networks.to_json}")
79
+ networks
80
+ end
81
+
82
+ def resolve_volume_boot(env)
83
+ config = env[:machine].provider_config
84
+ return nil if config.volume_boot.nil?
85
+ return resolve_volume_without_volume_service(env, config.volume_boot, 'vda') unless env[:openstack_client].session.endpoints.key? :volume
86
+
87
+ volume_list = env[:openstack_client].cinder.get_all_volumes(env)
88
+ volume_ids = volume_list.map(&:id)
89
+
90
+ @logger.debug(volume_list)
91
+
92
+ volume = resolve_volume(config.volume_boot, volume_list, volume_ids)
93
+
94
+ device = (volume[:device].nil?) ? 'vda' : volume[:device]
95
+ size = (volume[:size].nil?) ? nil : volume[:size]
96
+ delete_on_destroy = (volume[:delete_on_destroy].nil?) ? nil : volume[:delete_on_destroy]
97
+
98
+ image = resolve_volume_boot_image(env) unless volume[:image].nil?
99
+ image_id = (image.nil?) ? nil : image.id
100
+ if image.nil?
101
+ return { id: volume[:id], device: device }
102
+ else
103
+ { image: image_id, device: device, size: size, delete_on_destroy: delete_on_destroy }
104
+ end
105
+ end
106
+
107
+ def resolve_volumes(env)
108
+ @logger.info 'Resolving volume(s)'
109
+ config = env[:machine].provider_config
110
+ return [] if config.volumes.nil? || config.volumes.empty?
111
+ env[:ui].info(I18n.t('vagrant_openstack.finding_volumes'))
112
+ return resolve_volumes_without_volume_service(env) unless env[:openstack_client].session.endpoints.key? :volume
113
+
114
+ volume_list = env[:openstack_client].cinder.get_all_volumes(env)
115
+ volume_ids = volume_list.map(&:id)
116
+
117
+ @logger.debug(volume_list)
118
+
119
+ volumes = []
120
+ config.volumes.each do |volume|
121
+ volumes << resolve_volume(volume, volume_list, volume_ids)
122
+ end
123
+ @logger.debug("Resolved volumes : #{volumes.to_json}")
124
+ volumes
125
+ end
126
+
127
+ def resolve_ssh_username(env)
128
+ config = env[:machine].provider_config
129
+ machine_config = env[:machine].config
130
+ return machine_config.ssh.username if machine_config.ssh.username
131
+ return config.ssh_username if config.ssh_username
132
+ fail Errors::NoMatchingSshUsername
133
+ end
134
+
135
+ def resolve_security_groups(env)
136
+ groups = []
137
+ env[:machine].provider_config.security_groups.each do |group|
138
+ case group
139
+ when String
140
+ groups << { name: group }
141
+ when Hash
142
+ groups << group
143
+ end
144
+ end unless env[:machine].provider_config.security_groups.nil?
145
+ groups
146
+ end
147
+
148
+ private
149
+
150
+ def resolve_image_internal(env, image_name)
151
+ return nil if image_name.nil?
152
+
153
+ nova = env[:openstack_client].nova
154
+ env[:ui].info(I18n.t('vagrant_openstack.finding_image'))
155
+ images = nova.get_all_images(env)
156
+ image = find_matching(images, image_name)
157
+ fail Errors::NoMatchingImage unless image
158
+ image
159
+ end
160
+
161
+ def search_free_ip(config, nova, env)
162
+ @logger.debug 'Retrieving all allocated floating ips on tenant'
163
+ all_floating_ips = nova.get_all_floating_ips(env)
164
+ all_floating_ips.each do |floating_ip|
165
+ log_attach = floating_ip.instance_id ? "attached to #{floating_ip.instance_id}" : 'not attached'
166
+ @logger.debug "#{floating_ip.ip} #{log_attach}" if config.floating_ip_pool.include? floating_ip.pool
167
+ return floating_ip.ip if (config.floating_ip_pool.include? floating_ip.pool) && floating_ip.instance_id.nil?
168
+ end unless config.floating_ip_pool_always_allocate
169
+ @logger.debug 'No free ip found'
170
+ nil
171
+ end
172
+
173
+ def allocate_ip(config, nova, env)
174
+ allocation_error = nil
175
+ config.floating_ip_pool.each do |floating_ip_pool|
176
+ begin
177
+ @logger.debug "Allocating ip in pool #{floating_ip_pool}"
178
+ return nova.allocate_floating_ip(env, floating_ip_pool).ip
179
+ rescue Errors::VagrantOpenstackError => e
180
+ @logger.warn "Error allocating ip in pool #{floating_ip_pool} : #{e}"
181
+ allocation_error = e
182
+ next if e.extra_data[:code] == 404
183
+ raise allocation_error
184
+ end
185
+ end
186
+ @logger.warn 'Impossible to allocate a new IP'
187
+ fail allocation_error
188
+ end
189
+
190
+ def generate_keypair(env)
191
+ key = SSHKey.generate
192
+ nova = env[:openstack_client].nova
193
+ generated_keyname = nova.import_keypair(env, key.ssh_public_key)
194
+ file_path = "#{env[:machine].data_dir}/#{generated_keyname}"
195
+ File.write(file_path, key.private_key)
196
+ File.chmod(0600, file_path)
197
+ generated_keyname
198
+ end
199
+
200
+ def resolve_networks_without_network_service(env)
201
+ config = env[:machine].provider_config
202
+ networks = []
203
+ config.networks.each do |network|
204
+ case network
205
+ when String
206
+ env[:ui].info(I18n.t('vagrant_openstack.warn_network_identifier_is_assumed_to_be_an_id', network: network))
207
+ networks << { uuid: network }
208
+ when Hash
209
+ fail Errors::ConflictNetworkNameId, network: network if network.key?(:name) && network.key?(:id)
210
+ fail Errors::NetworkServiceUnavailable if network.key? :name
211
+ if network.key?(:address)
212
+ networks << { uuid: network[:id], fixed_ip: network[:address] }
213
+ else
214
+ networks << { uuid: network[:id] }
215
+ end
216
+ end
217
+ end
218
+ networks
219
+ end
220
+
221
+ def resolve_network(network, network_list, network_ids)
222
+ return resolve_network_from_string(network, network_list) if network.is_a? String
223
+ return resolve_network_from_hash(network, network_list, network_ids) if network.is_a? Hash
224
+ fail Errors::InvalidNetworkObject, network: network
225
+ end
226
+
227
+ def resolve_network_from_string(network, network_list)
228
+ found_network = find_matching(network_list, network)
229
+ fail Errors::UnresolvedNetwork, network: network if found_network.nil?
230
+ { uuid: found_network.id }
231
+ end
232
+
233
+ def resolve_network_from_hash(network, network_list, network_ids)
234
+ if network.key?(:id)
235
+ fail Errors::ConflictNetworkNameId, network: network if network.key?(:name)
236
+ network_id = network[:id]
237
+ fail Errors::UnresolvedNetworkId, id: network_id unless network_ids.include? network_id
238
+ elsif network.key?(:name)
239
+ network_list.each do |v|
240
+ next unless v.name.eql? network[:name]
241
+ fail Errors::MultipleNetworkName, name: network[:name] unless network_id.nil?
242
+ network_id = v.id
243
+ end
244
+ fail Errors::UnresolvedNetworkName, name: network[:name] unless network_ids.include? network_id
245
+ else
246
+ fail Errors::ConflictNetworkNameId, network: network
247
+ end
248
+ return { uuid: network_id, fixed_ip: network[:address] } if network.key?(:address)
249
+ { uuid: network_id }
250
+ end
251
+
252
+ def resolve_volumes_without_volume_service(env)
253
+ env[:machine].provider_config.volumes.map { |volume| resolve_volume_without_volume_service(env, volume) }
254
+ end
255
+
256
+ def resolve_volume_without_volume_service(env, volume, default_device = nil)
257
+ case volume
258
+ when String
259
+ env[:ui].info(I18n.t('vagrant_openstack.warn_volume_identifier_is_assumed_to_be_an_id', volume: volume))
260
+ return { id: volume, device: default_device }
261
+ when Hash
262
+ fail Errors::ConflictVolumeNameId, volume: volume if volume.key?(:name) && volume.key?(:id)
263
+ fail Errors::VolumeServiceUnavailable if volume.key? :name
264
+ return { id: volume[:id], device: volume[:device] || default_device }
265
+ end
266
+ fail Errors::InvalidVolumeObject, volume: volume
267
+ end
268
+
269
+ def resolve_volume(volume, volume_list, volume_ids)
270
+ return resolve_volume_from_string(volume, volume_list) if volume.is_a? String
271
+ return resolve_volume_from_hash(volume, volume_list, volume_ids) if volume.is_a? Hash
272
+ fail Errors::InvalidVolumeObject, volume: volume
273
+ end
274
+
275
+ def resolve_volume_from_string(volume, volume_list)
276
+ found_volume = find_matching(volume_list, volume)
277
+ fail Errors::UnresolvedVolume, volume: volume if found_volume.nil?
278
+ { id: found_volume.id, device: nil }
279
+ end
280
+
281
+ def resolve_volume_from_hash(volume, volume_list, volume_ids)
282
+ device = nil
283
+ device = volume[:device] if volume.key?(:device)
284
+ delete_on_destroy = (volume[:delete_on_destroy].nil?) ? 'true' : volume[:delete_on_destroy]
285
+
286
+ volume_id = nil
287
+ if volume.key?(:id)
288
+ fail Errors::ConflictVolumeNameId, volume: volume if volume.key?(:name)
289
+ check_boot_volume_conflict(volume)
290
+ volume_id = volume[:id]
291
+ fail Errors::UnresolvedVolumeId, id: volume_id unless volume_ids.include? volume_id
292
+ elsif volume.key?(:name)
293
+ volume_list.each do |v|
294
+ next unless v.name.eql? volume[:name]
295
+ fail Errors::MultipleVolumeName, name: volume[:name] unless volume_id.nil?
296
+ check_boot_volume_conflict(volume)
297
+ volume_id = v.id
298
+ end
299
+ fail Errors::UnresolvedVolumeName, name: volume[:name] unless volume_ids.include? volume_id
300
+ elsif volume.key?(:image)
301
+ fail Errors::UnresolvedVolume, volume: volume unless volume.key?(:size)
302
+ fail Errors::ConflictBootVolume, volume: volume if volume.key?(:id)
303
+ fail Errors::ConflictBootVolume, volume: volume if volume.key?(:name)
304
+ return { image: volume[:image], device: device, size: volume[:size], delete_on_destroy: delete_on_destroy }
305
+ else
306
+ fail Errors::ConflictBootVolume, volume: volume
307
+ end
308
+ { id: volume_id, device: device }
309
+ end
310
+
311
+ def check_boot_volume_conflict(volume)
312
+ fail Errors::ConflictBootVolume, volume: volume if volume.key?(:image) || volume.key?(:size) || volume.key?(:delete_on_destroy)
313
+ end
314
+
315
+ # This method finds any matching _thing_ from a list of names
316
+ # in a collection of _things_. The first to match is the returned
317
+ # one. Names in list can be a regexp, a partial match is chosen
318
+ # as well.
319
+
320
+ def find_matching(collection, name_or_names)
321
+ name_or_names = [name_or_names] if name_or_names.class != Array
322
+ name_or_names.each do |name|
323
+ collection.each do |single|
324
+ return single if single.id == name
325
+ return single if single.name == name
326
+ return single if name.is_a?(Regexp) && name =~ single.name
327
+ end
328
+ end
329
+ @logger.error "No element of '#{name_or_names}' found in collection #{collection}"
330
+ nil
331
+ end
332
+ end
333
+ end
334
+ end
@@ -0,0 +1,187 @@
1
+ require 'vagrant'
2
+
3
+ module VagrantPlugins
4
+ module Openstack
5
+ module Errors
6
+ class VagrantOpenstackError < Vagrant::Errors::VagrantError
7
+ #
8
+ # Added for vagrant 1.4.x compatibility This attribute had been
9
+ # added in Vagrant::Errors::VagrantError form the version 1.5.0
10
+ #
11
+ attr_accessor :extra_data
12
+
13
+ def initialize(args = nil)
14
+ @extra_data = args
15
+ super(args)
16
+ end
17
+
18
+ error_namespace('vagrant_openstack.errors')
19
+ error_key(:default)
20
+ end
21
+
22
+ class Timeout < VagrantOpenstackError
23
+ error_key(:timeout)
24
+ end
25
+
26
+ class AuthenticationRequired < VagrantOpenstackError
27
+ error_key(:authentication_required)
28
+ end
29
+
30
+ class AuthenticationFailed < VagrantOpenstackError
31
+ error_key(:authentication_failed)
32
+ end
33
+
34
+ class BadAuthenticationEndpoint < VagrantOpenstackError
35
+ error_key(:bad_authentication_endpoint)
36
+ end
37
+
38
+ class NoMatchingApiVersion < VagrantOpenstackError
39
+ error_key(:no_matching_api_version)
40
+ end
41
+
42
+ class CreateBadState < VagrantOpenstackError
43
+ error_key(:create_bad_state)
44
+ end
45
+
46
+ class NoMatchingFlavor < VagrantOpenstackError
47
+ error_key(:no_matching_flavor)
48
+ end
49
+
50
+ class NoMatchingImage < VagrantOpenstackError
51
+ error_key(:no_matching_image)
52
+ end
53
+
54
+ class ConflictBootVolume < VagrantOpenstackError
55
+ error_key(:conflict_boot_volume)
56
+ end
57
+
58
+ class SyncMethodError < VagrantOpenstackError
59
+ error_key(:sync_method_error)
60
+ end
61
+
62
+ class RsyncError < VagrantOpenstackError
63
+ error_key(:rsync_error)
64
+ end
65
+
66
+ class SshUnavailable < VagrantOpenstackError
67
+ error_key(:ssh_unavailble)
68
+ end
69
+
70
+ class NoArgRequiredForCommand < VagrantOpenstackError
71
+ error_key(:no_arg_required_for_command)
72
+ end
73
+
74
+ class UnrecognizedArgForCommand < VagrantOpenstackError
75
+ error_key(:unrecognized_arg_for_command)
76
+ end
77
+
78
+ class UnableToResolveFloatingIP < VagrantOpenstackError
79
+ error_key(:unable_to_resolve_floating_ip)
80
+ end
81
+
82
+ class UnableToResolveIP < VagrantOpenstackError
83
+ error_key(:unable_to_resolve_ip)
84
+ end
85
+
86
+ class UnableToResolveSSHKey < VagrantOpenstackError
87
+ error_key(:unable_to_resolve_ssh_key)
88
+ end
89
+
90
+ class InvalidNetworkObject < VagrantOpenstackError
91
+ error_key(:invalid_network_format)
92
+ end
93
+
94
+ class UnresolvedNetwork < VagrantOpenstackError
95
+ error_key(:unresolved_network)
96
+ end
97
+
98
+ class UnresolvedNetworkId < VagrantOpenstackError
99
+ error_key(:unresolved_network_id)
100
+ end
101
+
102
+ class UnresolvedNetworkName < VagrantOpenstackError
103
+ error_key(:unresolved_network_name)
104
+ end
105
+
106
+ class ConflictNetworkNameId < VagrantOpenstackError
107
+ error_key(:conflict_network_name_id)
108
+ end
109
+
110
+ class MultipleNetworkName < VagrantOpenstackError
111
+ error_key(:multiple_network_name)
112
+ end
113
+
114
+ class InvalidVolumeObject < VagrantOpenstackError
115
+ error_key(:invalid_volume_format)
116
+ end
117
+
118
+ class UnresolvedVolume < VagrantOpenstackError
119
+ error_key(:unresolved_volume)
120
+ end
121
+
122
+ class UnresolvedVolumeId < VagrantOpenstackError
123
+ error_key(:unresolved_volume_id)
124
+ end
125
+
126
+ class UnresolvedVolumeName < VagrantOpenstackError
127
+ error_key(:unresolved_volume_name)
128
+ end
129
+
130
+ class ConflictVolumeNameId < VagrantOpenstackError
131
+ error_key(:conflict_volume_name_id)
132
+ end
133
+
134
+ class MultipleVolumeName < VagrantOpenstackError
135
+ error_key(:multiple_volume_name)
136
+ end
137
+
138
+ class MissingBootOption < VagrantOpenstackError
139
+ error_key(:missing_boot_option)
140
+ end
141
+
142
+ class ConflictBootOption < VagrantOpenstackError
143
+ error_key(:conflict_boot_option)
144
+ end
145
+
146
+ class NoMatchingSshUsername < VagrantOpenstackError
147
+ error_key(:ssh_username_missing)
148
+ end
149
+
150
+ class InstanceNotFound < VagrantOpenstackError
151
+ error_key(:instance_not_found)
152
+ end
153
+
154
+ class StackNotFound < VagrantOpenstackError
155
+ error_key(:stack_not_found)
156
+ end
157
+
158
+ class NetworkServiceUnavailable < VagrantOpenstackError
159
+ error_key(:nerwork_service_unavailable)
160
+ end
161
+
162
+ class VolumeServiceUnavailable < VagrantOpenstackError
163
+ error_key(:volume_service_unavailable)
164
+ end
165
+
166
+ class FloatingIPAlreadyAssigned < VagrantOpenstackError
167
+ error_key(:floating_ip_already_assigned)
168
+ end
169
+
170
+ class FloatingIPNotAvailable < VagrantOpenstackError
171
+ error_key(:floating_ip_not_available)
172
+ end
173
+
174
+ class ServerStatusError < VagrantOpenstackError
175
+ error_key(:server_status_error)
176
+ end
177
+
178
+ class StackStatusError < VagrantOpenstackError
179
+ error_key(:stack_status_error)
180
+ end
181
+
182
+ class MissingNovaEndpoint < VagrantOpenstackError
183
+ error_key(:missing_nova_endpoint)
184
+ end
185
+ end
186
+ end
187
+ end