vagrant-openstack-provider 0.6.1 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +12 -5
- data/CHANGELOG.md +18 -0
- data/Gemfile +3 -2
- data/{LICENSE.txt → LICENSE} +2 -1
- data/lib/vagrant-openstack-provider/action.rb +3 -2
- data/lib/vagrant-openstack-provider/action/provision.rb +60 -0
- data/lib/vagrant-openstack-provider/action/read_ssh_info.rb +4 -0
- data/lib/vagrant-openstack-provider/client/domain.rb +2 -2
- data/lib/vagrant-openstack-provider/client/keystone.rb +17 -6
- data/lib/vagrant-openstack-provider/client/nova.rb +14 -3
- data/lib/vagrant-openstack-provider/command/abstract_command.rb +1 -0
- data/lib/vagrant-openstack-provider/command/main.rb +1 -3
- data/lib/vagrant-openstack-provider/config.rb +3 -3
- data/lib/vagrant-openstack-provider/config_resolver.rb +46 -16
- data/lib/vagrant-openstack-provider/errors.rb +15 -0
- data/lib/vagrant-openstack-provider/plugin.rb +7 -1
- data/lib/vagrant-openstack-provider/version.rb +11 -1
- data/lib/vagrant-openstack-provider/version_checker.rb +76 -0
- data/locales/en.yml +21 -4
- data/spec/vagrant-openstack-provider/action/connect_openstack_spec.rb +17 -19
- data/spec/vagrant-openstack-provider/action/create_server_spec.rb +19 -18
- data/spec/vagrant-openstack-provider/action/create_stack_spec.rb +4 -6
- data/spec/vagrant-openstack-provider/action/delete_server_spec.rb +4 -6
- data/spec/vagrant-openstack-provider/action/delete_stack_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/action/message_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/action/provision_spec.rb +104 -0
- data/spec/vagrant-openstack-provider/action/read_ssh_info_spec.rb +1 -3
- data/spec/vagrant-openstack-provider/action/read_state_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/action/resume_server_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/action/start_server_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/action/stop_server_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/action/suspend_server_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/action/sync_folders_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/action/wait_accessible_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/action/wait_active_spec.rb +3 -4
- data/spec/vagrant-openstack-provider/action/wait_stop_spec.rb +3 -4
- data/spec/vagrant-openstack-provider/action_spec.rb +0 -1
- data/spec/vagrant-openstack-provider/client/cinder_spec.rb +5 -8
- data/spec/vagrant-openstack-provider/client/glance_spec.rb +69 -70
- data/spec/vagrant-openstack-provider/client/heat_spec.rb +24 -28
- data/spec/vagrant-openstack-provider/client/keystone_spec.rb +34 -16
- data/spec/vagrant-openstack-provider/client/neutron_spec.rb +76 -80
- data/spec/vagrant-openstack-provider/client/nova_spec.rb +198 -168
- data/spec/vagrant-openstack-provider/client/utils_spec.rb +1 -3
- data/spec/vagrant-openstack-provider/command/flavor_list_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/command/floatingip_list_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/command/image_list_spec.rb +1 -6
- data/spec/vagrant-openstack-provider/command/network_list_spec.rb +1 -3
- data/spec/vagrant-openstack-provider/command/reset_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/command/subnet_list_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/command/volume_list_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/config_resolver_spec.rb +100 -6
- data/spec/vagrant-openstack-provider/config_spec.rb +2 -6
- data/spec/vagrant-openstack-provider/e2e_spec.rb.save +27 -0
- data/spec/vagrant-openstack-provider/spec_helper.rb +1 -0
- data/spec/vagrant-openstack-provider/utils_spec.rb +1 -2
- data/spec/vagrant-openstack-provider/version_checker_spec.rb +39 -0
- data/vagrant-openstack-provider.gemspec +4 -2
- metadata +29 -9
- data/gemfiles/latest_stable.gemfile +0 -10
- data/gemfiles/minimal_release.gemfile +0 -10
- data/gemfiles/previous_release.gemfile +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 36585a8dacc29b73947055b81be3b41c1c7fd9ef
|
4
|
+
data.tar.gz: 74481f1a768d1438f31d2ef73a76fc2e2d06961b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1483cf07c6d36599a99b441b20bc1f5db2f74df01723e88b6a766b89fd8a5353b3725f9b0427dd93b04d2dcb6b9775e7363e89e781fca8fbd3fb3fdf9ae21ff
|
7
|
+
data.tar.gz: 751776de2b6099cc462e7db5980f1f6aea185e7b361549cc07c7f0eab1ae4729cfbd6938ca8d5ca47d690334bc0794be1ecdeb31c9ae984ac31c73b964bbf5e9
|
data/.rubocop.yml
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
AllCops:
|
2
2
|
Exclude:
|
3
3
|
- 'out/**/*'
|
4
|
+
- '**/Vagrantfile'
|
4
5
|
|
5
6
|
Style/FileName:
|
6
7
|
Enabled: false
|
@@ -11,18 +12,24 @@ Style/Encoding:
|
|
11
12
|
Style/Documentation:
|
12
13
|
Enabled: false
|
13
14
|
|
14
|
-
|
15
|
+
Metrics/ClassLength:
|
15
16
|
Max: 300
|
16
17
|
|
17
|
-
|
18
|
+
Metrics/CyclomaticComplexity:
|
18
19
|
Severity: warning
|
19
20
|
Max: 15
|
20
21
|
|
21
|
-
|
22
|
+
Metrics/MethodLength:
|
22
23
|
Max: 60
|
23
24
|
|
24
|
-
|
25
|
+
Metrics/LineLength:
|
25
26
|
Max: 150
|
26
27
|
|
27
|
-
|
28
|
+
Metrics/ParameterLists:
|
28
29
|
Max: 6
|
30
|
+
|
31
|
+
Metrics/AbcSize:
|
32
|
+
Max: 110
|
33
|
+
|
34
|
+
Metrics/PerceivedComplexity:
|
35
|
+
Max: 45
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
# 0.7.0 (August, 10, 2015)
|
2
|
+
|
3
|
+
FEATURES:
|
4
|
+
|
5
|
+
- Access to obtained floating IP from provisioner phase [#205](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/205)
|
6
|
+
|
7
|
+
IMPROVEMENTS:
|
8
|
+
|
9
|
+
- Autodetect new version of the provider and provide info message to update [#132](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/132)
|
10
|
+
- Documentation for the `ssh_timeout` option [#230](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/230)
|
11
|
+
|
12
|
+
BUG FIXES:
|
13
|
+
|
14
|
+
- scheduler_hints ignored due to incorrect json tag in create request [#231](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/231)
|
15
|
+
- delete_keypair_if_vagrant throws exception if key_name is missing [#238](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/238)
|
16
|
+
- Fix Vagrant 1.4 bug, extra_data attr not found [#211](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/211)
|
17
|
+
- Add suffix /tokens in auth url if missing [#208](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/208)
|
18
|
+
|
1
19
|
# 0.6.1 (January 30, 2015)
|
2
20
|
|
3
21
|
IMPROVEMENTS:
|
data/Gemfile
CHANGED
@@ -5,8 +5,9 @@ gemspec
|
|
5
5
|
group :development do
|
6
6
|
gem 'vagrant', git: 'https://github.com/mitchellh/vagrant.git', tag: 'v1.6.5'
|
7
7
|
gem 'appraisal', '1.0.0'
|
8
|
-
gem 'rubocop', '0.
|
8
|
+
gem 'rubocop', '0.29.0', require: false
|
9
9
|
gem 'coveralls', require: false
|
10
|
+
gem 'rspec-its'
|
10
11
|
end
|
11
12
|
|
12
13
|
group :debug do
|
@@ -14,5 +15,5 @@ group :debug do
|
|
14
15
|
end
|
15
16
|
|
16
17
|
group :plugins do
|
17
|
-
gem
|
18
|
+
gem 'vagrant-openstack-provider', path: '.'
|
18
19
|
end
|
data/{LICENSE.txt → LICENSE}
RENAMED
@@ -1,4 +1,5 @@
|
|
1
1
|
Copyright (c) 2013 Mitchell Hashimoto
|
2
|
+
Copyright (c) 2015 Guillaume Giamarchi, Julien Vey
|
2
3
|
|
3
4
|
MIT License
|
4
5
|
|
@@ -19,4 +20,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
20
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
21
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
22
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -33,7 +33,7 @@ module VagrantPlugins
|
|
33
33
|
if env[:machine_state_id] == :not_created
|
34
34
|
b2.use Message, I18n.t('vagrant_openstack.not_created')
|
35
35
|
else
|
36
|
-
b2.use
|
36
|
+
b2.use ProvisionWrapper
|
37
37
|
b2.use SyncFolders
|
38
38
|
end
|
39
39
|
end
|
@@ -99,7 +99,7 @@ module VagrantPlugins
|
|
99
99
|
case env[:machine_state_id]
|
100
100
|
when :not_created
|
101
101
|
ssh_disabled = env[:machine].provider_config.ssh_disabled
|
102
|
-
b2.use
|
102
|
+
b2.use ProvisionWrapper unless ssh_disabled
|
103
103
|
b2.use SyncFolders
|
104
104
|
b2.use CreateStack
|
105
105
|
b2.use CreateServer
|
@@ -212,6 +212,7 @@ module VagrantPlugins
|
|
212
212
|
autoload :SyncFolders, action_root.join('sync_folders')
|
213
213
|
autoload :Suspend, action_root.join('suspend')
|
214
214
|
autoload :Resume, action_root.join('resume')
|
215
|
+
autoload :ProvisionWrapper, action_root.join('provision')
|
215
216
|
autoload :WaitForServerToStop, action_root.join('wait_stop')
|
216
217
|
autoload :WaitForServerToBeActive, action_root.join('wait_active')
|
217
218
|
autoload :WaitForServerToBeAccessible, action_root.join('wait_accessible')
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
|
3
|
+
require 'vagrant/action/builder'
|
4
|
+
|
5
|
+
require 'vagrant-openstack-provider/action/abstract_action'
|
6
|
+
require 'vagrant-openstack-provider/action/read_ssh_info'
|
7
|
+
|
8
|
+
module VagrantPlugins
|
9
|
+
module Openstack
|
10
|
+
module Action
|
11
|
+
include Vagrant::Action::Builtin
|
12
|
+
|
13
|
+
class ProvisionWrapper < AbstractAction
|
14
|
+
def initialize(app, env)
|
15
|
+
@app = app
|
16
|
+
@env = env
|
17
|
+
@logger = Log4r::Logger.new('vagrant_openstack::action::provision_wrapper')
|
18
|
+
end
|
19
|
+
|
20
|
+
def execute(env)
|
21
|
+
@logger.info 'Run provisioning'
|
22
|
+
InternalProvisionWrapper.new(@app, @env).call(@env)
|
23
|
+
@app.call(env)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class InternalProvisionWrapper < Vagrant::Action::Builtin::Provision
|
28
|
+
def initialize(app, env)
|
29
|
+
@logger = Log4r::Logger.new('vagrant_openstack::action::internal_provision_wrapper')
|
30
|
+
super app, env
|
31
|
+
end
|
32
|
+
|
33
|
+
def run_provisioner(env)
|
34
|
+
if env[:provisioner].class == VagrantPlugins::Shell::Provisioner
|
35
|
+
handle_shell_meta_args(env)
|
36
|
+
end
|
37
|
+
env[:provisioner].provision
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def handle_shell_meta_args(env)
|
43
|
+
config = env[:provisioner].config
|
44
|
+
args = config.args.nil? ? [] : [config.args].flatten
|
45
|
+
config.args = []
|
46
|
+
@logger.info "Shell provisioner args: #{args}"
|
47
|
+
args.each do |arg|
|
48
|
+
if '@@ssh_ip@@'.eql? arg
|
49
|
+
ssh_info = VagrantPlugins::Openstack::Action.get_ssh_info(env)
|
50
|
+
@logger.info "Replace meta-arg #{arg} by value #{ssh_info[:host]}"
|
51
|
+
config.args << ssh_info[:host]
|
52
|
+
else
|
53
|
+
config.args << arg
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -106,7 +106,7 @@ module VagrantPlugins
|
|
106
106
|
#
|
107
107
|
attr_accessor :device
|
108
108
|
|
109
|
-
# rubocop:disable
|
109
|
+
# rubocop:disable Metrics/ParameterLists
|
110
110
|
def initialize(id, name, size, status, bootable, instance_id, device)
|
111
111
|
@size = size
|
112
112
|
@status = status
|
@@ -115,7 +115,7 @@ module VagrantPlugins
|
|
115
115
|
@device = device
|
116
116
|
super(id, name)
|
117
117
|
end
|
118
|
-
# rubocop:enable
|
118
|
+
# rubocop:enable Metrics/ParameterLists
|
119
119
|
|
120
120
|
def to_s
|
121
121
|
{
|
@@ -32,15 +32,18 @@ module VagrantPlugins
|
|
32
32
|
}
|
33
33
|
}
|
34
34
|
|
35
|
-
|
35
|
+
auth_url = get_auth_url_v2 env
|
36
|
+
|
37
|
+
headers = {
|
38
|
+
content_type: :json,
|
39
|
+
accept: :json
|
40
|
+
}
|
41
|
+
|
42
|
+
log_request(:POST, auth_url, post_body.to_json, headers)
|
36
43
|
|
37
44
|
post_body[:auth][:passwordCredentials][:password] = config.password
|
38
45
|
|
39
|
-
authentication = RestUtils.post(env,
|
40
|
-
content_type: :json,
|
41
|
-
accept: :json,
|
42
|
-
timeout: config.http.read_timeout,
|
43
|
-
open_timeout: config.http.open_timeout) do |response|
|
46
|
+
authentication = RestUtils.post(env, auth_url, post_body.to_json, headers) do |response|
|
44
47
|
log_response(response)
|
45
48
|
case response.code
|
46
49
|
when 200
|
@@ -61,6 +64,14 @@ module VagrantPlugins
|
|
61
64
|
|
62
65
|
access['serviceCatalog']
|
63
66
|
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def get_auth_url_v2(env)
|
71
|
+
url = env[:machine].provider_config.openstack_auth_url
|
72
|
+
return url if url.match(%r{/tokens/*$})
|
73
|
+
"#{url}/tokens"
|
74
|
+
end
|
64
75
|
end
|
65
76
|
end
|
66
77
|
end
|
@@ -51,7 +51,16 @@ module VagrantPlugins
|
|
51
51
|
server = {}.tap do |s|
|
52
52
|
s['name'] = options[:name]
|
53
53
|
if options[:image_ref].nil?
|
54
|
-
s['block_device_mapping'] = [{ volume_id: options[:volume_boot][:id],
|
54
|
+
s['block_device_mapping'] = [{ volume_id: options[:volume_boot][:id],
|
55
|
+
device_name: options[:volume_boot][:device] }] if options[:volume_boot].key?(:id)
|
56
|
+
s['block_device_mapping_v2'] = [{ boot_index: '0',
|
57
|
+
volume_size: options[:volume_boot][:size],
|
58
|
+
uuid: options[:volume_boot][:image],
|
59
|
+
device_name: options[:volume_boot][:device],
|
60
|
+
source_type: 'image',
|
61
|
+
destination_type: 'volume',
|
62
|
+
delete_on_termination: options[:volume_boot][:delete_on_destroy] }]\
|
63
|
+
if options[:volume_boot].key?(:image)
|
55
64
|
else
|
56
65
|
s['imageRef'] = options[:image_ref]
|
57
66
|
end
|
@@ -64,7 +73,7 @@ module VagrantPlugins
|
|
64
73
|
s['networks'] = options[:networks] unless options[:networks].nil? || options[:networks].empty?
|
65
74
|
end
|
66
75
|
object = { server: server }
|
67
|
-
object[:scheduler_hints] = options[:scheduler_hints] unless options[:scheduler_hints].nil?
|
76
|
+
object['os:scheduler_hints'] = options[:scheduler_hints] unless options[:scheduler_hints].nil?
|
68
77
|
server = post(env, "#{@session.endpoints[:compute]}/servers", object.to_json)
|
69
78
|
JSON.parse(server)['server']['id']
|
70
79
|
end
|
@@ -137,7 +146,9 @@ module VagrantPlugins
|
|
137
146
|
def delete_keypair_if_vagrant(env, server_id)
|
138
147
|
instance_exists do
|
139
148
|
keyname = get_server_details(env, server_id)['key_name']
|
140
|
-
|
149
|
+
if keyname
|
150
|
+
delete(env, "#{@session.endpoints[:compute]}/os-keypairs/#{keyname}") if keyname.start_with?('vagrant-generated-')
|
151
|
+
end
|
141
152
|
end
|
142
153
|
end
|
143
154
|
|
@@ -2,7 +2,7 @@ module VagrantPlugins
|
|
2
2
|
module Openstack
|
3
3
|
module Command
|
4
4
|
COMMANDS = [
|
5
|
-
{ name: :'image-list', file: 'image_list'
|
5
|
+
{ name: :'image-list', file: 'image_list', clazz: 'ImageList' },
|
6
6
|
{ name: :'flavor-list', file: 'flavor_list', clazz: 'FlavorList' },
|
7
7
|
{ name: :'network-list', file: 'network_list', clazz: 'NetworkList' },
|
8
8
|
{ name: :'subnet-list', file: 'subnet_list', clazz: 'SubnetList' },
|
@@ -13,7 +13,6 @@ module VagrantPlugins
|
|
13
13
|
|
14
14
|
class Main < Vagrant.plugin('2', :command)
|
15
15
|
def self.synopsis
|
16
|
-
Openstack.init_i18n
|
17
16
|
I18n.t('vagrant_openstack.command.main_synopsis')
|
18
17
|
end
|
19
18
|
|
@@ -33,7 +32,6 @@ module VagrantPlugins
|
|
33
32
|
end
|
34
33
|
|
35
34
|
def execute
|
36
|
-
Openstack.init_i18n
|
37
35
|
command_class = @commands.get(@sub_command.to_sym) if @sub_command
|
38
36
|
return usage unless command_class && @sub_command
|
39
37
|
command_class.new(@sub_args, @env).execute(@sub_command)
|
@@ -258,7 +258,7 @@ module VagrantPlugins
|
|
258
258
|
# Don't set the value if it is the unset value, either.
|
259
259
|
value = obj.instance_variable_get(key)
|
260
260
|
|
261
|
-
if [:@networks, :@volumes, :@rsync_includes, :@
|
261
|
+
if [:@networks, :@volumes, :@rsync_includes, :@rsync_ignore_files, :@floating_ip_pool, :@stacks].include? key
|
262
262
|
result.instance_variable_set(key, value) unless value.empty?
|
263
263
|
elsif [:@http].include? key
|
264
264
|
result.instance_variable_set(key, instance_variable_get(key).merge(other.instance_variable_get(key))) if value != UNSET_VALUE
|
@@ -276,7 +276,7 @@ module VagrantPlugins
|
|
276
276
|
result
|
277
277
|
end
|
278
278
|
|
279
|
-
# rubocop:disable
|
279
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
280
280
|
def finalize!
|
281
281
|
@password = nil if @password == UNSET_VALUE
|
282
282
|
@openstack_compute_url = nil if @openstack_compute_url == UNSET_VALUE
|
@@ -323,7 +323,7 @@ module VagrantPlugins
|
|
323
323
|
@stacks = nil if @stacks.empty?
|
324
324
|
@http.finalize!
|
325
325
|
end
|
326
|
-
# rubocop:enable
|
326
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
327
327
|
|
328
328
|
def rsync_include(inc)
|
329
329
|
@rsync_includes << inc
|
@@ -25,15 +25,12 @@ module VagrantPlugins
|
|
25
25
|
|
26
26
|
def resolve_image(env)
|
27
27
|
@logger.info 'Resolving image'
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
image = find_matching(images, config.image)
|
35
|
-
fail Errors::NoMatchingImage unless image
|
36
|
-
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])
|
37
34
|
end
|
38
35
|
|
39
36
|
def resolve_floating_ip(env)
|
@@ -65,7 +62,7 @@ module VagrantPlugins
|
|
65
62
|
return resolve_networks_without_network_service(env) unless env[:openstack_client].session.endpoints.key? :network
|
66
63
|
|
67
64
|
all_networks = env[:openstack_client].neutron.get_all_networks(env)
|
68
|
-
all_network_ids = all_networks.map
|
65
|
+
all_network_ids = all_networks.map(&:id)
|
69
66
|
|
70
67
|
networks = []
|
71
68
|
config.networks.each do |network|
|
@@ -76,20 +73,28 @@ module VagrantPlugins
|
|
76
73
|
end
|
77
74
|
|
78
75
|
def resolve_volume_boot(env)
|
79
|
-
@logger.info 'Resolving image'
|
80
76
|
config = env[:machine].provider_config
|
81
77
|
return nil if config.volume_boot.nil?
|
82
78
|
return resolve_volume_without_volume_service(env, config.volume_boot, 'vda') unless env[:openstack_client].session.endpoints.key? :volume
|
83
79
|
|
84
80
|
volume_list = env[:openstack_client].cinder.get_all_volumes(env)
|
85
|
-
volume_ids = volume_list.map
|
81
|
+
volume_ids = volume_list.map(&:id)
|
86
82
|
|
87
83
|
@logger.debug(volume_list)
|
88
84
|
|
89
85
|
volume = resolve_volume(config.volume_boot, volume_list, volume_ids)
|
90
|
-
device = volume[:device].nil? ? 'vda' : volume[:device]
|
91
86
|
|
92
|
-
|
87
|
+
device = (volume[:device].nil?) ? 'vda' : volume[:device]
|
88
|
+
size = (volume[:size].nil?) ? nil : volume[:size]
|
89
|
+
delete_on_destroy = (volume[:delete_on_destroy].nil?) ? nil : volume[:delete_on_destroy]
|
90
|
+
|
91
|
+
image = resolve_volume_boot_image(env) unless volume[:image].nil?
|
92
|
+
image_id = (image.nil?) ? nil : image.id
|
93
|
+
if image.nil?
|
94
|
+
return { id: volume[:id], device: device }
|
95
|
+
else
|
96
|
+
{ image: image_id, device: device, size: size, delete_on_destroy: delete_on_destroy }
|
97
|
+
end
|
93
98
|
end
|
94
99
|
|
95
100
|
def resolve_volumes(env)
|
@@ -100,7 +105,7 @@ module VagrantPlugins
|
|
100
105
|
return resolve_volumes_without_volume_service(env) unless env[:openstack_client].session.endpoints.key? :volume
|
101
106
|
|
102
107
|
volume_list = env[:openstack_client].cinder.get_all_volumes(env)
|
103
|
-
volume_ids = volume_list.map
|
108
|
+
volume_ids = volume_list.map(&:id)
|
104
109
|
|
105
110
|
@logger.debug(volume_list)
|
106
111
|
|
@@ -135,6 +140,17 @@ module VagrantPlugins
|
|
135
140
|
|
136
141
|
private
|
137
142
|
|
143
|
+
def resolve_image_internal(env, image_name)
|
144
|
+
return nil if image_name.nil?
|
145
|
+
|
146
|
+
nova = env[:openstack_client].nova
|
147
|
+
env[:ui].info(I18n.t('vagrant_openstack.finding_image'))
|
148
|
+
images = nova.get_all_images(env)
|
149
|
+
image = find_matching(images, image_name)
|
150
|
+
fail Errors::NoMatchingImage unless image
|
151
|
+
image
|
152
|
+
end
|
153
|
+
|
138
154
|
def search_free_ip(config, nova, env)
|
139
155
|
@logger.debug 'Retrieving all allocated floating ips on tenant'
|
140
156
|
all_floating_ips = nova.get_all_floating_ips(env)
|
@@ -258,23 +274,37 @@ module VagrantPlugins
|
|
258
274
|
def resolve_volume_from_hash(volume, volume_list, volume_ids)
|
259
275
|
device = nil
|
260
276
|
device = volume[:device] if volume.key?(:device)
|
277
|
+
delete_on_destroy = (volume[:delete_on_destroy].nil?) ? 'true' : volume[:delete_on_destroy]
|
278
|
+
|
279
|
+
volume_id = nil
|
261
280
|
if volume.key?(:id)
|
262
281
|
fail Errors::ConflictVolumeNameId, volume: volume if volume.key?(:name)
|
282
|
+
check_boot_volume_conflict(volume)
|
263
283
|
volume_id = volume[:id]
|
264
284
|
fail Errors::UnresolvedVolumeId, id: volume_id unless volume_ids.include? volume_id
|
265
285
|
elsif volume.key?(:name)
|
266
286
|
volume_list.each do |v|
|
267
287
|
next unless v.name.eql? volume[:name]
|
268
288
|
fail Errors::MultipleVolumeName, name: volume[:name] unless volume_id.nil?
|
289
|
+
check_boot_volume_conflict(volume)
|
269
290
|
volume_id = v.id
|
270
291
|
end
|
271
292
|
fail Errors::UnresolvedVolumeName, name: volume[:name] unless volume_ids.include? volume_id
|
293
|
+
elsif volume.key?(:image)
|
294
|
+
fail Errors::UnresolvedVolume, volume: volume unless volume.key?(:size)
|
295
|
+
fail Errors::ConflictBootVolume, volume: volume if volume.key?(:id)
|
296
|
+
fail Errors::ConflictBootVolume, volume: volume if volume.key?(:name)
|
297
|
+
return { image: volume[:image], device: device, size: volume[:size], delete_on_destroy: delete_on_destroy }
|
272
298
|
else
|
273
|
-
fail Errors::
|
299
|
+
fail Errors::ConflictBootVolume, volume: volume
|
274
300
|
end
|
275
301
|
{ id: volume_id, device: device }
|
276
302
|
end
|
277
303
|
|
304
|
+
def check_boot_volume_conflict(volume)
|
305
|
+
fail Errors::ConflictBootVolume, volume: volume if volume.key?(:image) || volume.key?(:size) || volume.key?(:delete_on_destroy)
|
306
|
+
end
|
307
|
+
|
278
308
|
# This method finds any matching _thing_ from a list of names
|
279
309
|
# in a collection of _things_. The first to match is the returned
|
280
310
|
# one. Names in list can be a regexp, a partial match is chosen
|