vagrant-conoha 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rubocop.yml +35 -0
  4. data/CHANGELOG.md +3 -0
  5. data/Gemfile +19 -0
  6. data/LICENSE +23 -0
  7. data/Rakefile +25 -0
  8. data/Vagrantfile +71 -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-conoha.rb +29 -0
  17. data/lib/vagrant-conoha/action.rb +227 -0
  18. data/lib/vagrant-conoha/action/abstract_action.rb +22 -0
  19. data/lib/vagrant-conoha/action/connect_openstack.rb +60 -0
  20. data/lib/vagrant-conoha/action/create_server.rb +154 -0
  21. data/lib/vagrant-conoha/action/create_stack.rb +68 -0
  22. data/lib/vagrant-conoha/action/delete_server.rb +53 -0
  23. data/lib/vagrant-conoha/action/delete_stack.rb +73 -0
  24. data/lib/vagrant-conoha/action/message.rb +19 -0
  25. data/lib/vagrant-conoha/action/provision.rb +60 -0
  26. data/lib/vagrant-conoha/action/read_ssh_info.rb +72 -0
  27. data/lib/vagrant-conoha/action/read_state.rb +43 -0
  28. data/lib/vagrant-conoha/action/resume.rb +24 -0
  29. data/lib/vagrant-conoha/action/start_server.rb +24 -0
  30. data/lib/vagrant-conoha/action/stop_server.rb +25 -0
  31. data/lib/vagrant-conoha/action/suspend.rb +24 -0
  32. data/lib/vagrant-conoha/action/sync_folders.rb +129 -0
  33. data/lib/vagrant-conoha/action/wait_accessible.rb +61 -0
  34. data/lib/vagrant-conoha/action/wait_active.rb +33 -0
  35. data/lib/vagrant-conoha/action/wait_stop.rb +33 -0
  36. data/lib/vagrant-conoha/catalog/openstack_catalog.rb +67 -0
  37. data/lib/vagrant-conoha/client/cinder.rb +39 -0
  38. data/lib/vagrant-conoha/client/domain.rb +159 -0
  39. data/lib/vagrant-conoha/client/glance.rb +65 -0
  40. data/lib/vagrant-conoha/client/heat.rb +49 -0
  41. data/lib/vagrant-conoha/client/http_utils.rb +116 -0
  42. data/lib/vagrant-conoha/client/keystone.rb +77 -0
  43. data/lib/vagrant-conoha/client/neutron.rb +48 -0
  44. data/lib/vagrant-conoha/client/nova.rb +212 -0
  45. data/lib/vagrant-conoha/client/openstack.rb +59 -0
  46. data/lib/vagrant-conoha/client/request_logger.rb +23 -0
  47. data/lib/vagrant-conoha/client/rest_utils.rb +25 -0
  48. data/lib/vagrant-conoha/command/abstract_command.rb +51 -0
  49. data/lib/vagrant-conoha/command/flavor_list.rb +24 -0
  50. data/lib/vagrant-conoha/command/image_list.rb +29 -0
  51. data/lib/vagrant-conoha/command/main.rb +51 -0
  52. data/lib/vagrant-conoha/command/network_list.rb +25 -0
  53. data/lib/vagrant-conoha/command/openstack_command.rb +16 -0
  54. data/lib/vagrant-conoha/command/reset.rb +20 -0
  55. data/lib/vagrant-conoha/command/subnet_list.rb +22 -0
  56. data/lib/vagrant-conoha/command/utils.rb +22 -0
  57. data/lib/vagrant-conoha/command/volume_list.rb +25 -0
  58. data/lib/vagrant-conoha/config.rb +390 -0
  59. data/lib/vagrant-conoha/config/http.rb +39 -0
  60. data/lib/vagrant-conoha/config_resolver.rb +285 -0
  61. data/lib/vagrant-conoha/errors.rb +187 -0
  62. data/lib/vagrant-conoha/logging.rb +39 -0
  63. data/lib/vagrant-conoha/plugin.rb +48 -0
  64. data/lib/vagrant-conoha/provider.rb +50 -0
  65. data/lib/vagrant-conoha/utils.rb +26 -0
  66. data/lib/vagrant-conoha/version.rb +15 -0
  67. data/lib/vagrant-conoha/version_checker.rb +76 -0
  68. data/locales/en.yml +393 -0
  69. data/spec/vagrant-conoha/action/connect_openstack_spec.rb +695 -0
  70. data/spec/vagrant-conoha/action/create_server_spec.rb +225 -0
  71. data/spec/vagrant-conoha/action/create_stack_spec.rb +99 -0
  72. data/spec/vagrant-conoha/action/delete_server_spec.rb +89 -0
  73. data/spec/vagrant-conoha/action/delete_stack_spec.rb +63 -0
  74. data/spec/vagrant-conoha/action/message_spec.rb +33 -0
  75. data/spec/vagrant-conoha/action/provision_spec.rb +104 -0
  76. data/spec/vagrant-conoha/action/read_ssh_info_spec.rb +190 -0
  77. data/spec/vagrant-conoha/action/read_state_spec.rb +81 -0
  78. data/spec/vagrant-conoha/action/resume_server_spec.rb +49 -0
  79. data/spec/vagrant-conoha/action/start_server_spec.rb +49 -0
  80. data/spec/vagrant-conoha/action/stop_server_spec.rb +49 -0
  81. data/spec/vagrant-conoha/action/suspend_server_spec.rb +49 -0
  82. data/spec/vagrant-conoha/action/sync_folders_spec.rb +155 -0
  83. data/spec/vagrant-conoha/action/wait_accessible_spec.rb +67 -0
  84. data/spec/vagrant-conoha/action/wait_active_spec.rb +53 -0
  85. data/spec/vagrant-conoha/action/wait_stop_spec.rb +53 -0
  86. data/spec/vagrant-conoha/action_spec.rb +120 -0
  87. data/spec/vagrant-conoha/client/cinder_spec.rb +127 -0
  88. data/spec/vagrant-conoha/client/glance_spec.rb +143 -0
  89. data/spec/vagrant-conoha/client/heat_spec.rb +128 -0
  90. data/spec/vagrant-conoha/client/keystone_spec.rb +150 -0
  91. data/spec/vagrant-conoha/client/neutron_spec.rb +171 -0
  92. data/spec/vagrant-conoha/client/nova_spec.rb +757 -0
  93. data/spec/vagrant-conoha/client/utils_spec.rb +176 -0
  94. data/spec/vagrant-conoha/command/flavor_list_spec.rb +43 -0
  95. data/spec/vagrant-conoha/command/image_list_spec.rb +95 -0
  96. data/spec/vagrant-conoha/command/network_list_spec.rb +65 -0
  97. data/spec/vagrant-conoha/command/reset_spec.rb +24 -0
  98. data/spec/vagrant-conoha/command/subnet_list_spec.rb +45 -0
  99. data/spec/vagrant-conoha/command/volume_list_spec.rb +40 -0
  100. data/spec/vagrant-conoha/config_resolver_spec.rb +860 -0
  101. data/spec/vagrant-conoha/config_spec.rb +373 -0
  102. data/spec/vagrant-conoha/e2e_spec.rb.save +27 -0
  103. data/spec/vagrant-conoha/provider_spec.rb +13 -0
  104. data/spec/vagrant-conoha/spec_helper.rb +37 -0
  105. data/spec/vagrant-conoha/utils_spec.rb +129 -0
  106. data/spec/vagrant-conoha/version_checker_spec.rb +39 -0
  107. data/stackrc +25 -0
  108. data/vagrant-conoha.gemspec +32 -0
  109. metadata +343 -0
@@ -0,0 +1,39 @@
1
+ module VagrantPlugins
2
+ module ConoHa
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,285 @@
1
+ module VagrantPlugins
2
+ module ConoHa
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_keypair(env)
37
+ config = env[:machine].provider_config
38
+ nova = env[:openstack_client].nova
39
+ return config.keypair_name if config.keypair_name
40
+ return nova.import_keypair_from_file(env, config.public_key_path) if config.public_key_path
41
+ generate_keypair(env)
42
+ end
43
+
44
+ def resolve_networks(env)
45
+ @logger.info 'Resolving network(s)'
46
+ config = env[:machine].provider_config
47
+ return [] if config.networks.nil? || config.networks.empty?
48
+ env[:ui].info(I18n.t('vagrant_openstack.finding_networks'))
49
+ return resolve_networks_without_network_service(env) unless env[:openstack_client].session.endpoints.key? :network
50
+
51
+ all_networks = env[:openstack_client].neutron.get_all_networks(env)
52
+ all_network_ids = all_networks.map(&:id)
53
+
54
+ networks = []
55
+ config.networks.each do |network|
56
+ networks << resolve_network(network, all_networks, all_network_ids)
57
+ end
58
+ @logger.debug("Resolved networks : #{networks.to_json}")
59
+ networks
60
+ end
61
+
62
+ def resolve_volume_boot(env)
63
+ config = env[:machine].provider_config
64
+ return nil if config.volume_boot.nil?
65
+ return resolve_volume_without_volume_service(env, config.volume_boot, 'vda') unless env[:openstack_client].session.endpoints.key? :volume
66
+
67
+ volume_list = env[:openstack_client].cinder.get_all_volumes(env)
68
+ volume_ids = volume_list.map(&:id)
69
+
70
+ @logger.debug(volume_list)
71
+
72
+ volume = resolve_volume(config.volume_boot, volume_list, volume_ids)
73
+
74
+ device = (volume[:device].nil?) ? 'vda' : volume[:device]
75
+ size = (volume[:size].nil?) ? nil : volume[:size]
76
+ delete_on_destroy = (volume[:delete_on_destroy].nil?) ? nil : volume[:delete_on_destroy]
77
+
78
+ image = resolve_volume_boot_image(env) unless volume[:image].nil?
79
+ image_id = (image.nil?) ? nil : image.id
80
+ if image.nil?
81
+ return { id: volume[:id], device: device }
82
+ else
83
+ { image: image_id, device: device, size: size, delete_on_destroy: delete_on_destroy }
84
+ end
85
+ end
86
+
87
+ def resolve_volumes(env)
88
+ @logger.info 'Resolving volume(s)'
89
+ config = env[:machine].provider_config
90
+ return [] if config.volumes.nil? || config.volumes.empty?
91
+ env[:ui].info(I18n.t('vagrant_openstack.finding_volumes'))
92
+ return resolve_volumes_without_volume_service(env) unless env[:openstack_client].session.endpoints.key? :volume
93
+
94
+ volume_list = env[:openstack_client].cinder.get_all_volumes(env)
95
+ volume_ids = volume_list.map(&:id)
96
+
97
+ @logger.debug(volume_list)
98
+
99
+ volumes = []
100
+ config.volumes.each do |volume|
101
+ volumes << resolve_volume(volume, volume_list, volume_ids)
102
+ end
103
+ @logger.debug("Resolved volumes : #{volumes.to_json}")
104
+ volumes
105
+ end
106
+
107
+ def resolve_ssh_username(env)
108
+ config = env[:machine].provider_config
109
+ machine_config = env[:machine].config
110
+ return machine_config.ssh.username if machine_config.ssh.username
111
+ return config.ssh_username if config.ssh_username
112
+ fail Errors::NoMatchingSshUsername
113
+ end
114
+
115
+ def resolve_security_groups(env)
116
+ groups = []
117
+ env[:machine].provider_config.security_groups.each do |group|
118
+ case group
119
+ when String
120
+ groups << { name: group }
121
+ when Hash
122
+ groups << group
123
+ end
124
+ end unless env[:machine].provider_config.security_groups.nil?
125
+ groups
126
+ end
127
+
128
+ private
129
+
130
+ def resolve_image_internal(env, image_name)
131
+ return nil if image_name.nil?
132
+
133
+ nova = env[:openstack_client].nova
134
+ env[:ui].info(I18n.t('vagrant_openstack.finding_image'))
135
+ images = nova.get_all_images(env)
136
+ image = find_matching(images, image_name)
137
+ fail Errors::NoMatchingImage unless image
138
+ image
139
+ end
140
+
141
+ def generate_keypair(env)
142
+ key = SSHKey.generate
143
+ nova = env[:openstack_client].nova
144
+ generated_keyname = nova.import_keypair(env, key.ssh_public_key)
145
+ file_path = "#{env[:machine].data_dir}/#{generated_keyname}"
146
+ File.write(file_path, key.private_key)
147
+ File.chmod(0600, file_path)
148
+ generated_keyname
149
+ end
150
+
151
+ def resolve_networks_without_network_service(env)
152
+ config = env[:machine].provider_config
153
+ networks = []
154
+ config.networks.each do |network|
155
+ case network
156
+ when String
157
+ env[:ui].info(I18n.t('vagrant_openstack.warn_network_identifier_is_assumed_to_be_an_id', network: network))
158
+ networks << { uuid: network }
159
+ when Hash
160
+ fail Errors::ConflictNetworkNameId, network: network if network.key?(:name) && network.key?(:id)
161
+ fail Errors::NetworkServiceUnavailable if network.key? :name
162
+ if network.key?(:address)
163
+ networks << { uuid: network[:id], fixed_ip: network[:address] }
164
+ else
165
+ networks << { uuid: network[:id] }
166
+ end
167
+ end
168
+ end
169
+ networks
170
+ end
171
+
172
+ def resolve_network(network, network_list, network_ids)
173
+ return resolve_network_from_string(network, network_list) if network.is_a? String
174
+ return resolve_network_from_hash(network, network_list, network_ids) if network.is_a? Hash
175
+ fail Errors::InvalidNetworkObject, network: network
176
+ end
177
+
178
+ def resolve_network_from_string(network, network_list)
179
+ found_network = find_matching(network_list, network)
180
+ fail Errors::UnresolvedNetwork, network: network if found_network.nil?
181
+ { uuid: found_network.id }
182
+ end
183
+
184
+ def resolve_network_from_hash(network, network_list, network_ids)
185
+ if network.key?(:id)
186
+ fail Errors::ConflictNetworkNameId, network: network if network.key?(:name)
187
+ network_id = network[:id]
188
+ fail Errors::UnresolvedNetworkId, id: network_id unless network_ids.include? network_id
189
+ elsif network.key?(:name)
190
+ network_list.each do |v|
191
+ next unless v.name.eql? network[:name]
192
+ fail Errors::MultipleNetworkName, name: network[:name] unless network_id.nil?
193
+ network_id = v.id
194
+ end
195
+ fail Errors::UnresolvedNetworkName, name: network[:name] unless network_ids.include? network_id
196
+ else
197
+ fail Errors::ConflictNetworkNameId, network: network
198
+ end
199
+ return { uuid: network_id, fixed_ip: network[:address] } if network.key?(:address)
200
+ { uuid: network_id }
201
+ end
202
+
203
+ def resolve_volumes_without_volume_service(env)
204
+ env[:machine].provider_config.volumes.map { |volume| resolve_volume_without_volume_service(env, volume) }
205
+ end
206
+
207
+ def resolve_volume_without_volume_service(env, volume, default_device = nil)
208
+ case volume
209
+ when String
210
+ env[:ui].info(I18n.t('vagrant_openstack.warn_volume_identifier_is_assumed_to_be_an_id', volume: volume))
211
+ return { id: volume, device: default_device }
212
+ when Hash
213
+ fail Errors::ConflictVolumeNameId, volume: volume if volume.key?(:name) && volume.key?(:id)
214
+ fail Errors::VolumeServiceUnavailable if volume.key? :name
215
+ return { id: volume[:id], device: volume[:device] || default_device }
216
+ end
217
+ fail Errors::InvalidVolumeObject, volume: volume
218
+ end
219
+
220
+ def resolve_volume(volume, volume_list, volume_ids)
221
+ return resolve_volume_from_string(volume, volume_list) if volume.is_a? String
222
+ return resolve_volume_from_hash(volume, volume_list, volume_ids) if volume.is_a? Hash
223
+ fail Errors::InvalidVolumeObject, volume: volume
224
+ end
225
+
226
+ def resolve_volume_from_string(volume, volume_list)
227
+ found_volume = find_matching(volume_list, volume)
228
+ fail Errors::UnresolvedVolume, volume: volume if found_volume.nil?
229
+ { id: found_volume.id, device: nil }
230
+ end
231
+
232
+ def resolve_volume_from_hash(volume, volume_list, volume_ids)
233
+ device = nil
234
+ device = volume[:device] if volume.key?(:device)
235
+ delete_on_destroy = (volume[:delete_on_destroy].nil?) ? 'true' : volume[:delete_on_destroy]
236
+
237
+ volume_id = nil
238
+ if volume.key?(:id)
239
+ fail Errors::ConflictVolumeNameId, volume: volume if volume.key?(:name)
240
+ check_boot_volume_conflict(volume)
241
+ volume_id = volume[:id]
242
+ fail Errors::UnresolvedVolumeId, id: volume_id unless volume_ids.include? volume_id
243
+ elsif volume.key?(:name)
244
+ volume_list.each do |v|
245
+ next unless v.name.eql? volume[:name]
246
+ fail Errors::MultipleVolumeName, name: volume[:name] unless volume_id.nil?
247
+ check_boot_volume_conflict(volume)
248
+ volume_id = v.id
249
+ end
250
+ fail Errors::UnresolvedVolumeName, name: volume[:name] unless volume_ids.include? volume_id
251
+ elsif volume.key?(:image)
252
+ fail Errors::UnresolvedVolume, volume: volume unless volume.key?(:size)
253
+ fail Errors::ConflictBootVolume, volume: volume if volume.key?(:id)
254
+ fail Errors::ConflictBootVolume, volume: volume if volume.key?(:name)
255
+ return { image: volume[:image], device: device, size: volume[:size], delete_on_destroy: delete_on_destroy }
256
+ else
257
+ fail Errors::ConflictBootVolume, volume: volume
258
+ end
259
+ { id: volume_id, device: device }
260
+ end
261
+
262
+ def check_boot_volume_conflict(volume)
263
+ fail Errors::ConflictBootVolume, volume: volume if volume.key?(:image) || volume.key?(:size) || volume.key?(:delete_on_destroy)
264
+ end
265
+
266
+ # This method finds any matching _thing_ from a list of names
267
+ # in a collection of _things_. The first to match is the returned
268
+ # one. Names in list can be a regexp, a partial match is chosen
269
+ # as well.
270
+
271
+ def find_matching(collection, name_or_names)
272
+ name_or_names = [name_or_names] if name_or_names.class != Array
273
+ name_or_names.each do |name|
274
+ collection.each do |single|
275
+ return single if single.id == name
276
+ return single if single.name == name
277
+ return single if name.is_a?(Regexp) && name =~ single.name
278
+ end
279
+ end
280
+ @logger.error "No element of '#{name_or_names}' found in collection #{collection}"
281
+ nil
282
+ end
283
+ end
284
+ end
285
+ end
@@ -0,0 +1,187 @@
1
+ require 'vagrant'
2
+
3
+ module VagrantPlugins
4
+ module ConoHa
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