vagrant-openstack-provider 0.4.1 → 0.5.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -2
- data/CHANGELOG.md +22 -0
- data/Gemfile +8 -15
- data/Vagrantfile +12 -10
- data/gemfiles/latest_stable.gemfile +6 -16
- data/gemfiles/minimal_release.gemfile +10 -0
- data/gemfiles/previous_release.gemfile +6 -16
- data/lib/vagrant-openstack-provider/action/connect_openstack.rb +2 -1
- data/lib/vagrant-openstack-provider/action/create_server.rb +40 -248
- data/lib/vagrant-openstack-provider/action/read_ssh_info.rb +30 -29
- data/lib/vagrant-openstack-provider/action/sync_folders.rb +19 -9
- data/lib/vagrant-openstack-provider/action/wait_accessible.rb +58 -0
- data/lib/vagrant-openstack-provider/action/wait_active.rb +5 -3
- data/lib/vagrant-openstack-provider/action/wait_stop.rb +5 -3
- data/lib/vagrant-openstack-provider/action.rb +19 -11
- data/lib/vagrant-openstack-provider/client/http_utils.rb +3 -2
- data/lib/vagrant-openstack-provider/client/neutron.rb +11 -1
- data/lib/vagrant-openstack-provider/client/nova.rb +49 -30
- data/lib/vagrant-openstack-provider/command/abstract_command.rb +10 -1
- data/lib/vagrant-openstack-provider/command/flavor_list.rb +1 -1
- data/lib/vagrant-openstack-provider/command/floatingip_list.rb +1 -1
- data/lib/vagrant-openstack-provider/command/image_list.rb +1 -1
- data/lib/vagrant-openstack-provider/command/main.rb +2 -1
- data/lib/vagrant-openstack-provider/command/network_list.rb +8 -2
- data/lib/vagrant-openstack-provider/command/reset.rb +21 -0
- data/lib/vagrant-openstack-provider/command/utils.rb +1 -1
- data/lib/vagrant-openstack-provider/command/volume_list.rb +1 -1
- data/lib/vagrant-openstack-provider/config.rb +16 -1
- data/lib/vagrant-openstack-provider/config_resolver.rb +262 -0
- data/lib/vagrant-openstack-provider/errors.rb +40 -0
- data/lib/vagrant-openstack-provider/plugin.rb +3 -3
- data/lib/vagrant-openstack-provider/utils.rb +21 -0
- data/lib/vagrant-openstack-provider/version.rb +1 -1
- data/locales/en.yml +35 -1
- data/spec/vagrant-openstack-provider/action/create_server_spec.rb +121 -368
- data/spec/vagrant-openstack-provider/action/delete_server_spec.rb +54 -0
- data/spec/vagrant-openstack-provider/action/message_spec.rb +34 -0
- data/spec/vagrant-openstack-provider/action/read_ssh_info_spec.rb +34 -17
- data/spec/vagrant-openstack-provider/action/read_state_spec.rb +70 -0
- data/spec/vagrant-openstack-provider/action/resume_server_spec.rb +50 -0
- data/spec/vagrant-openstack-provider/action/start_server_spec.rb +50 -0
- data/spec/vagrant-openstack-provider/action/stop_server_spec.rb +50 -0
- data/spec/vagrant-openstack-provider/action/suspend_server_spec.rb +50 -0
- data/spec/vagrant-openstack-provider/action/sync_folders_spec.rb +155 -0
- data/spec/vagrant-openstack-provider/action/wait_accessible_spec.rb +68 -0
- data/spec/vagrant-openstack-provider/action/wait_active_spec.rb +47 -0
- data/spec/vagrant-openstack-provider/action/wait_stop_spec.rb +47 -0
- data/spec/vagrant-openstack-provider/action_spec.rb +121 -0
- data/spec/vagrant-openstack-provider/client/cinder_spec.rb +1 -1
- data/spec/vagrant-openstack-provider/client/keystone_spec.rb +1 -1
- data/spec/vagrant-openstack-provider/client/neutron_spec.rb +37 -1
- data/spec/vagrant-openstack-provider/client/nova_spec.rb +60 -7
- data/spec/vagrant-openstack-provider/client/utils_spec.rb +1 -1
- data/spec/vagrant-openstack-provider/command/flavor_list_spec.rb +44 -0
- data/spec/vagrant-openstack-provider/command/floatingip_list_spec.rb +19 -2
- data/spec/vagrant-openstack-provider/command/image_list_spec.rb +48 -0
- data/spec/vagrant-openstack-provider/command/network_list_spec.rb +67 -0
- data/spec/vagrant-openstack-provider/command/reset_spec.rb +25 -0
- data/spec/vagrant-openstack-provider/command/volume_list_spec.rb +10 -2
- data/spec/vagrant-openstack-provider/config_resolver_spec.rb +680 -0
- data/spec/vagrant-openstack-provider/config_spec.rb +15 -1
- data/spec/vagrant-openstack-provider/spec_helper.rb +3 -0
- data/spec/vagrant-openstack-provider/utils_spec.rb +103 -0
- data/vagrant-openstack-provider.gemspec +4 -2
- metadata +78 -11
- data/Appraisals +0 -13
- data/gemfiles/oldest_current.gemfile +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d9e64c02d3bf2d8b9e0bcc903a02546cc51e7bce
|
4
|
+
data.tar.gz: 8e5200339ede584e5cfbf980b49b98a41146e275
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f56b3c7bde75c3813dee4bc83de5e9d9e367e71fc4f7d61fa0a486dce0f5130d559e8b26d55e30cd44babec3dd5c0544f0f20ca60327bf812f4448a40e5931a
|
7
|
+
data.tar.gz: 95711dba6f3275a1a54dd375424d5a536225d60c1c21ddb3c2514c59a23dde977e75db68a216c0a11f38a87ee69a682c8d5411e89ce9bf000233e4f521bde843
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,25 @@
|
|
1
|
+
# 0.5.0 (November 4, 2014)
|
2
|
+
|
3
|
+
FEATURES:
|
4
|
+
|
5
|
+
- Add an option to disable SSH Authentication and allow private vms [#120](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/120)
|
6
|
+
- Support for fixed IP address for private network [#87](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/87)
|
7
|
+
|
8
|
+
IMPROVEMENTS:
|
9
|
+
|
10
|
+
- Accept a string for ssh_timeout value [#144](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/144)
|
11
|
+
- Vagrant Openstack should works in degraded mode id only Keystone and Nova are availables [#142](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/142)
|
12
|
+
- Add custom command `vagrant openstack reset [#107](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/107)
|
13
|
+
- Make box optional [#105](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/105)
|
14
|
+
- vagrant up => Instance could not be found [#98](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/98)
|
15
|
+
|
16
|
+
BUG FIXES:
|
17
|
+
|
18
|
+
- security_groups should be an array of hashes [#137](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/137)
|
19
|
+
- user_data needs to be Base64 encoded in Nova.createServer [#122](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/122)
|
20
|
+
- SSH failures after port 22 is open because user doesn't exist yet [#106](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/106)
|
21
|
+
- Floating IP should not be mandatory [#55](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/55)
|
22
|
+
|
1
23
|
# 0.4.1 (October 3, 2014)
|
2
24
|
|
3
25
|
BUG FIXES:
|
data/Gemfile
CHANGED
@@ -2,24 +2,17 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
gem 'json', '1.7.7'
|
6
|
-
gem 'appraisal', '1.0.0'
|
7
|
-
gem 'rest-client', '~> 1.6.0'
|
8
|
-
gem 'terminal-table', '1.4.5'
|
9
|
-
gem 'webmock', '~> 1.18.0', group: [:test]
|
10
|
-
gem 'rubocop', '0.23.0', require: false
|
11
|
-
gem 'vagrant', git: 'git://github.com/mitchellh/vagrant.git', tag: 'v1.4.3'
|
12
|
-
gem 'fakefs', '~> 0.5.2', group: [:test]
|
13
|
-
gem 'sshkey', '~> 1.6.1'
|
14
|
-
gem 'colorize', '~> 0.7.3'
|
15
|
-
|
16
5
|
group :development do
|
17
|
-
|
18
|
-
|
19
|
-
|
6
|
+
gem 'vagrant', git: 'https://github.com/mitchellh/vagrant.git', tag: 'v1.6.5'
|
7
|
+
gem 'appraisal', '1.0.0'
|
8
|
+
gem 'rubocop', '0.23.0', require: false
|
20
9
|
gem 'coveralls', require: false
|
21
10
|
end
|
22
11
|
|
23
12
|
group :debug do
|
24
|
-
gem '
|
13
|
+
gem 'byebug'
|
14
|
+
end
|
15
|
+
|
16
|
+
group :plugins do
|
17
|
+
gem "vagrant-openstack-provider", path: "."
|
25
18
|
end
|
data/Vagrantfile
CHANGED
@@ -2,17 +2,19 @@ require 'vagrant-openstack-provider'
|
|
2
2
|
|
3
3
|
Vagrant.configure('2') do |config|
|
4
4
|
|
5
|
-
config.vm.box = '
|
6
|
-
|
7
|
-
config.ssh.username = '
|
5
|
+
config.vm.box = 'openstack'
|
6
|
+
|
7
|
+
config.ssh.username = ENV['OS_SSH_USERNAME']
|
8
8
|
|
9
9
|
config.vm.provider :openstack do |os|
|
10
|
-
os.
|
11
|
-
os.
|
12
|
-
os.
|
13
|
-
os.
|
14
|
-
os.
|
15
|
-
os.
|
16
|
-
os.
|
10
|
+
os.openstack_auth_url = ENV['OS_AUTH_URL']
|
11
|
+
os.tenant_name = ENV['OS_TENANT_NAME']
|
12
|
+
os.username = ENV['OS_USERNAME']
|
13
|
+
os.password = ENV['OS_PASSWORD']
|
14
|
+
os.floating_ip_pool = ENV['OS_FLOATING_IP_POOL']
|
15
|
+
os.flavor = ENV['OS_FLAVOR']
|
16
|
+
os.image = ENV['OS_IMAGE']
|
17
17
|
end
|
18
|
+
|
19
|
+
config.vm.provision "shell", inline: "echo 'ok' > ~/provision"
|
18
20
|
end
|
@@ -1,20 +1,10 @@
|
|
1
|
-
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
gem "appraisal", "1.0.0"
|
6
|
-
gem "restclient", "0.10.0"
|
7
|
-
gem "terminal-table", "1.4.5"
|
8
|
-
gem "webmock", "~> 1.18.0", :group => [:test]
|
9
|
-
gem "rubocop", "0.23.0", :require => false
|
10
|
-
gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git", :tag => "v1.4.3"
|
11
|
-
gem "fakefs", "~> 0.5.2", :group => [:test]
|
12
|
-
gem "sshkey", "~> 1.6.1"
|
13
|
-
gem "colorize", "~> 0.7.3"
|
3
|
+
gemspec :path => "../"
|
14
4
|
|
15
5
|
group :development do
|
16
|
-
gem
|
17
|
-
gem
|
6
|
+
gem 'vagrant', git: 'git://github.com/mitchellh/vagrant.git', tag: 'v1.6.5'
|
7
|
+
gem 'appraisal', '1.0.0'
|
8
|
+
gem 'rubocop', '0.23.0', require: false
|
9
|
+
gem 'coveralls', require: false
|
18
10
|
end
|
19
|
-
|
20
|
-
gemspec :path => "../"
|
@@ -0,0 +1,10 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec :path => "../"
|
4
|
+
|
5
|
+
group :development do
|
6
|
+
gem 'vagrant', git: 'git://github.com/mitchellh/vagrant.git', tag: 'v1.4.0'
|
7
|
+
gem 'appraisal', '1.0.0'
|
8
|
+
gem 'rubocop', '0.23.0', require: false
|
9
|
+
gem 'coveralls', require: false
|
10
|
+
end
|
@@ -1,20 +1,10 @@
|
|
1
|
-
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
gem "appraisal", "1.0.0"
|
6
|
-
gem "restclient", "0.10.0"
|
7
|
-
gem "terminal-table", "1.4.5"
|
8
|
-
gem "webmock", "~> 1.18.0", :group => [:test]
|
9
|
-
gem "rubocop", "0.23.0", :require => false
|
10
|
-
gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git", :tag => "v1.4.3"
|
11
|
-
gem "fakefs", "~> 0.5.2", :group => [:test]
|
12
|
-
gem "sshkey", "~> 1.6.1"
|
13
|
-
gem "colorize", "~> 0.7.3"
|
3
|
+
gemspec :path => "../"
|
14
4
|
|
15
5
|
group :development do
|
16
|
-
gem
|
17
|
-
gem
|
6
|
+
gem 'vagrant', git: 'git://github.com/mitchellh/vagrant.git', tag: 'v1.5.4'
|
7
|
+
gem 'appraisal', '1.0.0'
|
8
|
+
gem 'rubocop', '0.23.0', require: false
|
9
|
+
gem 'coveralls', require: false
|
18
10
|
end
|
19
|
-
|
20
|
-
gemspec :path => "../"
|
@@ -67,7 +67,8 @@ module VagrantPlugins
|
|
67
67
|
config = env[:machine].provider_config
|
68
68
|
client.session.endpoints[:compute] = config.openstack_compute_url unless config.openstack_compute_url.nil?
|
69
69
|
client.session.endpoints[:network] = config.openstack_network_url unless config.openstack_network_url.nil?
|
70
|
-
client.session.endpoints[:volume]
|
70
|
+
client.session.endpoints[:volume] = config.openstack_volume_url unless config.openstack_volume_url.nil?
|
71
|
+
client.session.endpoints.delete_if { |_, value| value.nil? || value.empty? }
|
71
72
|
end
|
72
73
|
|
73
74
|
def log_endpoint_catalog(env)
|
@@ -3,6 +3,8 @@ require 'socket'
|
|
3
3
|
require 'timeout'
|
4
4
|
require 'sshkey'
|
5
5
|
|
6
|
+
require 'vagrant-openstack-provider/config_resolver'
|
7
|
+
require 'vagrant-openstack-provider/utils'
|
6
8
|
require 'vagrant/util/retryable'
|
7
9
|
|
8
10
|
module VagrantPlugins
|
@@ -11,9 +13,11 @@ module VagrantPlugins
|
|
11
13
|
class CreateServer
|
12
14
|
include Vagrant::Util::Retryable
|
13
15
|
|
14
|
-
def initialize(app, _env)
|
16
|
+
def initialize(app, _env, resolver = ConfigResolver.new, utils = Utils.new)
|
15
17
|
@app = app
|
16
18
|
@logger = Log4r::Logger.new('vagrant_openstack::action::create_server')
|
19
|
+
@resolver = resolver
|
20
|
+
@utils = utils
|
17
21
|
end
|
18
22
|
|
19
23
|
def call(env)
|
@@ -24,18 +28,16 @@ module VagrantPlugins
|
|
24
28
|
fail Errors::MissingBootOption if config.image.nil? && config.volume_boot.nil?
|
25
29
|
fail Errors::ConflictBootOption unless config.image.nil? || config.volume_boot.nil?
|
26
30
|
|
27
|
-
nova = env[:openstack_client].nova
|
28
|
-
|
29
31
|
options = {
|
30
|
-
flavor: resolve_flavor(env),
|
31
|
-
image: resolve_image(env),
|
32
|
-
volume_boot: resolve_volume_boot(env),
|
33
|
-
networks: resolve_networks(env),
|
34
|
-
volumes: resolve_volumes(env),
|
35
|
-
keypair_name: resolve_keypair(env),
|
32
|
+
flavor: @resolver.resolve_flavor(env),
|
33
|
+
image: @resolver.resolve_image(env),
|
34
|
+
volume_boot: @resolver.resolve_volume_boot(env),
|
35
|
+
networks: @resolver.resolve_networks(env),
|
36
|
+
volumes: @resolver.resolve_volumes(env),
|
37
|
+
keypair_name: @resolver.resolve_keypair(env),
|
36
38
|
availability_zone: env[:machine].provider_config.availability_zone,
|
37
39
|
scheduler_hints: env[:machine].provider_config.scheduler_hints,
|
38
|
-
security_groups: env
|
40
|
+
security_groups: @resolver.resolve_security_groups(env),
|
39
41
|
user_data: env[:machine].provider_config.user_data,
|
40
42
|
metadata: env[:machine].provider_config.metadata
|
41
43
|
}
|
@@ -45,205 +47,15 @@ module VagrantPlugins
|
|
45
47
|
# Store the ID right away so we can track it
|
46
48
|
env[:machine].id = server_id
|
47
49
|
|
48
|
-
|
49
|
-
|
50
|
-
floating_ip = resolve_floating_ip(env)
|
51
|
-
if floating_ip && !floating_ip.empty?
|
52
|
-
@logger.info "Using floating IP #{floating_ip}"
|
53
|
-
env[:ui].info(I18n.t('vagrant_openstack.using_floating_ip', floating_ip: floating_ip))
|
54
|
-
nova.add_floating_ip(env, server_id, floating_ip)
|
55
|
-
end
|
56
|
-
|
50
|
+
waiting_for_server_to_be_built(env, server_id)
|
51
|
+
assign_floating_ip(env, server_id)
|
57
52
|
attach_volumes(env, server_id, options[:volumes]) unless options[:volumes].empty?
|
58
53
|
|
59
|
-
unless env[:interrupted]
|
60
|
-
# Clear the line one more time so the progress is removed
|
61
|
-
env[:ui].clear_line
|
62
|
-
|
63
|
-
# Wait for SSH to become available
|
64
|
-
ssh_timeout = env[:machine].provider_config.ssh_timeout
|
65
|
-
unless port_open?(env, floating_ip, resolve_ssh_port(env), ssh_timeout)
|
66
|
-
env[:ui].error(I18n.t('vagrant_openstack.timeout'))
|
67
|
-
fail Errors::SshUnavailable, host: floating_ip, timeout: ssh_timeout
|
68
|
-
end
|
69
|
-
|
70
|
-
@logger.info 'The server is ready'
|
71
|
-
env[:ui].info(I18n.t('vagrant_openstack.ready'))
|
72
|
-
end
|
73
|
-
|
74
54
|
@app.call(env)
|
75
55
|
end
|
76
56
|
|
77
57
|
private
|
78
58
|
|
79
|
-
def resolve_ssh_port(env)
|
80
|
-
machine_config = env[:machine].config
|
81
|
-
return machine_config.ssh.port if machine_config.ssh.port
|
82
|
-
22
|
83
|
-
end
|
84
|
-
|
85
|
-
# 1. if floating_ip is set, use it
|
86
|
-
# 2. if floating_ip_pool is set
|
87
|
-
# GET v2/{{tenant_id}}/os-floating-ips
|
88
|
-
# If any IP with the same pool is available, use it
|
89
|
-
# Else Allocate a new IP from the pool
|
90
|
-
# Manage error case
|
91
|
-
# 3. GET v2/{{tenant_id}}/os-floating-ips
|
92
|
-
# If any IP is available, use it
|
93
|
-
# Else fail
|
94
|
-
def resolve_floating_ip(env)
|
95
|
-
config = env[:machine].provider_config
|
96
|
-
nova = env[:openstack_client].nova
|
97
|
-
return config.floating_ip if config.floating_ip
|
98
|
-
floating_ips = nova.get_all_floating_ips(env)
|
99
|
-
if config.floating_ip_pool
|
100
|
-
floating_ips.each do |single|
|
101
|
-
return single.ip if single.pool == config.floating_ip_pool && single.instance_id.nil?
|
102
|
-
end unless config.floating_ip_pool_always_allocate
|
103
|
-
return nova.allocate_floating_ip(env, config.floating_ip_pool).ip
|
104
|
-
else
|
105
|
-
floating_ips.each do |ip|
|
106
|
-
return ip.ip if ip.instance_id.nil?
|
107
|
-
end
|
108
|
-
end
|
109
|
-
fail Errors::UnableToResolveFloatingIP
|
110
|
-
end
|
111
|
-
|
112
|
-
def resolve_keypair(env)
|
113
|
-
config = env[:machine].provider_config
|
114
|
-
nova = env[:openstack_client].nova
|
115
|
-
return config.keypair_name if config.keypair_name
|
116
|
-
return nova.import_keypair_from_file(env, config.public_key_path) if config.public_key_path
|
117
|
-
generate_keypair(env)
|
118
|
-
end
|
119
|
-
|
120
|
-
def generate_keypair(env)
|
121
|
-
key = SSHKey.generate
|
122
|
-
nova = env[:openstack_client].nova
|
123
|
-
generated_keyname = nova.import_keypair(env, key.ssh_public_key)
|
124
|
-
File.write("#{env[:machine].data_dir}/#{generated_keyname}", key.private_key)
|
125
|
-
generated_keyname
|
126
|
-
end
|
127
|
-
|
128
|
-
def resolve_flavor(env)
|
129
|
-
@logger.info 'Resolving flavor'
|
130
|
-
config = env[:machine].provider_config
|
131
|
-
nova = env[:openstack_client].nova
|
132
|
-
env[:ui].info(I18n.t('vagrant_openstack.finding_flavor'))
|
133
|
-
flavors = nova.get_all_flavors(env)
|
134
|
-
@logger.info "Finding flavor matching name '#{config.flavor}'"
|
135
|
-
flavor = find_matching(flavors, config.flavor)
|
136
|
-
fail Errors::NoMatchingFlavor unless flavor
|
137
|
-
flavor
|
138
|
-
end
|
139
|
-
|
140
|
-
def resolve_image(env)
|
141
|
-
@logger.info 'Resolving image'
|
142
|
-
config = env[:machine].provider_config
|
143
|
-
return nil if config.image.nil?
|
144
|
-
nova = env[:openstack_client].nova
|
145
|
-
env[:ui].info(I18n.t('vagrant_openstack.finding_image'))
|
146
|
-
images = nova.get_all_images(env)
|
147
|
-
@logger.info "Finding image matching name '#{config.image}'"
|
148
|
-
image = find_matching(images, config.image)
|
149
|
-
fail Errors::NoMatchingImage unless image
|
150
|
-
image
|
151
|
-
end
|
152
|
-
|
153
|
-
def resolve_networks(env)
|
154
|
-
@logger.info 'Resolving network(s)'
|
155
|
-
config = env[:machine].provider_config
|
156
|
-
return [] if config.networks.nil? || config.networks.empty?
|
157
|
-
env[:ui].info(I18n.t('vagrant_openstack.finding_networks'))
|
158
|
-
|
159
|
-
private_networks = env[:openstack_client].neutron.get_private_networks(env)
|
160
|
-
private_network_ids = private_networks.map { |n| n.id }
|
161
|
-
|
162
|
-
networks = []
|
163
|
-
config.networks.each do |network|
|
164
|
-
if private_network_ids.include?(network)
|
165
|
-
networks << network
|
166
|
-
next
|
167
|
-
end
|
168
|
-
net_id = nil
|
169
|
-
private_networks.each do |n| # Bad algorithm complexity, but here we don't care...
|
170
|
-
next unless n.name.eql? network
|
171
|
-
fail "Multiple networks with name '#{n.id}'" unless net_id.nil?
|
172
|
-
net_id = n.id
|
173
|
-
end
|
174
|
-
fail "No matching network with name '#{network}'" if net_id.nil?
|
175
|
-
networks << net_id
|
176
|
-
end
|
177
|
-
networks
|
178
|
-
end
|
179
|
-
|
180
|
-
def resolve_volume_boot(env)
|
181
|
-
@logger.info 'Resolving image'
|
182
|
-
config = env[:machine].provider_config
|
183
|
-
return nil if config.volume_boot.nil?
|
184
|
-
|
185
|
-
volume_list = env[:openstack_client].cinder.get_all_volumes(env)
|
186
|
-
volume_ids = volume_list.map { |v| v.id }
|
187
|
-
|
188
|
-
@logger.debug(volume_list)
|
189
|
-
|
190
|
-
volume = resolve_volume(config.volume_boot, volume_list, volume_ids)
|
191
|
-
device = volume[:device].nil? ? 'vda' : volume[:device]
|
192
|
-
|
193
|
-
{ id: volume[:id], device: device }
|
194
|
-
end
|
195
|
-
|
196
|
-
def resolve_volumes(env)
|
197
|
-
@logger.info 'Resolving volume(s)'
|
198
|
-
config = env[:machine].provider_config
|
199
|
-
return [] if config.volumes.nil? || config.volumes.empty?
|
200
|
-
env[:ui].info(I18n.t('vagrant_openstack.finding_volumes'))
|
201
|
-
|
202
|
-
volume_list = env[:openstack_client].cinder.get_all_volumes(env)
|
203
|
-
volume_ids = volume_list.map { |v| v.id }
|
204
|
-
|
205
|
-
@logger.debug(volume_list)
|
206
|
-
|
207
|
-
volumes = []
|
208
|
-
config.volumes.each do |volume|
|
209
|
-
volumes << resolve_volume(volume, volume_list, volume_ids)
|
210
|
-
end
|
211
|
-
@logger.debug("Resolved volumes : #{volumes.to_json}")
|
212
|
-
volumes
|
213
|
-
end
|
214
|
-
|
215
|
-
def resolve_volume(volume, volume_list, volume_ids)
|
216
|
-
return resolve_volume_from_string(volume, volume_list) if volume.is_a? String
|
217
|
-
return resolve_volume_from_hash(volume, volume_list, volume_ids) if volume.is_a? Hash
|
218
|
-
fail Errors::InvalidVolumeObject, volume: volume
|
219
|
-
end
|
220
|
-
|
221
|
-
def resolve_volume_from_string(volume, volume_list)
|
222
|
-
found_volume = find_matching(volume_list, volume)
|
223
|
-
fail Errors::UnresolvedVolume, volume: volume if found_volume.nil?
|
224
|
-
{ id: found_volume.id, device: nil }
|
225
|
-
end
|
226
|
-
|
227
|
-
def resolve_volume_from_hash(volume, volume_list, volume_ids)
|
228
|
-
device = nil
|
229
|
-
device = volume[:device] if volume.key?(:device)
|
230
|
-
if volume.key?(:id)
|
231
|
-
fail Errors::ConflictVolumeNameId, volume: volume if volume.key?(:name)
|
232
|
-
volume_id = volume[:id]
|
233
|
-
fail Errors::UnresolvedVolumeId, id: volume_id unless volume_ids.include? volume_id
|
234
|
-
elsif volume.key?(:name)
|
235
|
-
volume_list.each do |v|
|
236
|
-
next unless v.name.eql? volume[:name]
|
237
|
-
fail Errors::MultipleVolumeName, name: volume[:name] unless volume_id.nil?
|
238
|
-
volume_id = v.id
|
239
|
-
end
|
240
|
-
fail Errors::UnresolvedVolumeName, name: volume[:name] unless volume_ids.include? volume_id
|
241
|
-
else
|
242
|
-
fail Errors::ConflictVolumeNameId, volume: volume
|
243
|
-
end
|
244
|
-
{ id: volume_id, device: device }
|
245
|
-
end
|
246
|
-
|
247
59
|
def create_server(env, options)
|
248
60
|
config = env[:machine].provider_config
|
249
61
|
nova = env[:openstack_client].nova
|
@@ -262,11 +74,20 @@ module VagrantPlugins
|
|
262
74
|
env[:ui].info(" -- KeyPair : #{options[:keypair_name]}")
|
263
75
|
|
264
76
|
unless options[:networks].empty?
|
77
|
+
formated_networks = ' -- '
|
265
78
|
if options[:networks].size == 1
|
266
|
-
|
79
|
+
formated_networks << 'Network : '
|
267
80
|
else
|
268
|
-
|
81
|
+
formated_networks << 'Networks : '
|
269
82
|
end
|
83
|
+
formated_networks << options[:networks].map do |n|
|
84
|
+
if n.key? :fixed_ip
|
85
|
+
"#{n[:uuid]} (#{n[:fixed_ip]})"
|
86
|
+
else
|
87
|
+
n[:uuid]
|
88
|
+
end
|
89
|
+
end.join(', ')
|
90
|
+
env[:ui].info(formated_networks)
|
270
91
|
end
|
271
92
|
|
272
93
|
unless options[:volumes].empty?
|
@@ -305,62 +126,33 @@ module VagrantPlugins
|
|
305
126
|
nova.create_server(env, create_opts)
|
306
127
|
end
|
307
128
|
|
308
|
-
def
|
129
|
+
def waiting_for_server_to_be_built(env, server_id, retry_interval = 3, timeout = 200)
|
309
130
|
@logger.info 'Waiting for the server to be built...'
|
310
131
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_for_build'))
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
sleep 3
|
132
|
+
timeout(timeout) do
|
133
|
+
while env[:openstack_client].nova.get_server_details(env, server_id)['status'] != 'ACTIVE'
|
134
|
+
sleep retry_interval
|
315
135
|
@logger.debug('Waiting for server to be ACTIVE')
|
316
136
|
end
|
317
137
|
end
|
318
138
|
end
|
319
139
|
|
140
|
+
def assign_floating_ip(env, server_id)
|
141
|
+
floating_ip = @resolver.resolve_floating_ip(env)
|
142
|
+
return if !floating_ip || floating_ip.empty?
|
143
|
+
@logger.info "Using floating IP #{floating_ip}"
|
144
|
+
env[:ui].info(I18n.t('vagrant_openstack.using_floating_ip', floating_ip: floating_ip))
|
145
|
+
env[:openstack_client].nova.add_floating_ip(env, server_id, floating_ip)
|
146
|
+
rescue Errors::UnableToResolveFloatingIP
|
147
|
+
@logger.info 'Vagrant was unable to resolve FloatingIP, continue assuming it is not necessary'
|
148
|
+
end
|
149
|
+
|
320
150
|
def attach_volumes(env, server_id, volumes)
|
321
151
|
@logger.info("Attaching volumes #{volumes} to server #{server_id}")
|
322
|
-
nova = env[:openstack_client].nova
|
323
152
|
volumes.each do |volume|
|
324
153
|
@logger.debug("Attaching volumes #{volume}")
|
325
|
-
nova.attach_volume(env, server_id, volume[:id], volume[:device])
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
|
-
def port_open?(env, ip, port, timeout)
|
330
|
-
start_time = Time.now
|
331
|
-
current_time = start_time
|
332
|
-
nb_retry = 0
|
333
|
-
while (current_time - start_time) <= timeout
|
334
|
-
begin
|
335
|
-
@logger.debug "Checking if SSH port is open... Attempt number #{nb_retry}"
|
336
|
-
if nb_retry % 5 == 0
|
337
|
-
@logger.info 'Waiting for SSH to become available...'
|
338
|
-
env[:ui].info(I18n.t('vagrant_openstack.waiting_for_ssh'))
|
339
|
-
end
|
340
|
-
TCPSocket.new(ip, port)
|
341
|
-
return true
|
342
|
-
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ETIMEDOUT
|
343
|
-
@logger.debug 'SSH port is not open... new retry in in 1 second'
|
344
|
-
nb_retry += 1
|
345
|
-
sleep 1
|
346
|
-
end
|
347
|
-
current_time = Time.now
|
348
|
-
end
|
349
|
-
false
|
350
|
-
end
|
351
|
-
|
352
|
-
# This method finds a matching _thing_ in a collection of
|
353
|
-
# _things_. This works matching if the ID or NAME equals to
|
354
|
-
# `name`. Or, if `name` is a regexp, a partial match is chosen
|
355
|
-
# as well.
|
356
|
-
def find_matching(collection, name)
|
357
|
-
collection.each do |single|
|
358
|
-
return single if single.id == name
|
359
|
-
return single if single.name == name
|
360
|
-
return single if name.is_a?(Regexp) && name =~ single.name
|
154
|
+
env[:openstack_client].nova.attach_volume(env, server_id, volume[:id], volume[:device])
|
361
155
|
end
|
362
|
-
@logger.error "Element '#{name}' not found in collection #{collection}"
|
363
|
-
nil
|
364
156
|
end
|
365
157
|
end
|
366
158
|
end
|