vagrant-conoha 0.1.6 → 0.1.7
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/CHANGELOG.md +3 -0
- data/Gemfile +4 -1
- data/Vagrantfile +5 -45
- data/lib/vagrant-conoha/action.rb +18 -2
- data/lib/vagrant-conoha/action/create_server.rb +2 -2
- data/lib/vagrant-conoha/action/create_stack.rb +1 -1
- data/lib/vagrant-conoha/action/delete_server.rb +1 -1
- data/lib/vagrant-conoha/action/delete_stack.rb +1 -1
- data/lib/vagrant-conoha/action/wait_active.rb +1 -1
- data/lib/vagrant-conoha/action/wait_stop.rb +1 -1
- data/lib/vagrant-conoha/catalog/openstack_catalog.rb +35 -12
- data/lib/vagrant-conoha/client/keystone.rb +73 -22
- data/lib/vagrant-conoha/config.rb +83 -13
- data/lib/vagrant-conoha/utils.rb +6 -1
- data/lib/vagrant-conoha/version.rb +1 -1
- data/lib/vagrant-conoha/version_checker.rb +1 -1
- data/locales/en.yml +13 -2
- data/spec/vagrant-conoha/action/connect_openstack_spec.rb +75 -0
- data/spec/vagrant-conoha/client/keystone_spec.rb +74 -0
- data/spec/vagrant-conoha/client/nova_spec.rb +1 -1
- data/spec/vagrant-conoha/config_spec.rb +29 -1
- data/vagrant-conoha.gemspec +5 -3
- metadata +25 -13
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f5f6d8e918ef420c86161b4975201a0c2a8a7f57
|
|
4
|
+
data.tar.gz: bfed2b1a52dd42baabdc1d9bea2517372fa166ca
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: aa75a9dbdcc1ee891f3b47b7dfea65f4a92790ca6d65e1e49550982da4525e232df65e25c90e202d604c8d5b6b54f1b06d4335f1ca9734f6c115ee8701f43cd4
|
|
7
|
+
data.tar.gz: 5cd9d0b742944b21262f159c4fc45d0861391162959c35565fde7e3842102e0aabfaabbde21acb7384aa440fe9c06543d19436879d46f0d7d39a899f3b102302
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
|
@@ -3,7 +3,10 @@ source 'https://rubygems.org'
|
|
|
3
3
|
gemspec
|
|
4
4
|
|
|
5
5
|
group :development do
|
|
6
|
-
gem 'vagrant', git: 'https://github.com/mitchellh/vagrant.git', tag: 'v1.
|
|
6
|
+
gem 'vagrant', git: 'https://github.com/mitchellh/vagrant.git', tag: 'v1.9.1'
|
|
7
|
+
# FIXME: Hack to allow Vagrant v1.6.5 to install for tests. Remove when
|
|
8
|
+
# support for 1.6.5 is dropped.
|
|
9
|
+
gem 'rack', '< 2'
|
|
7
10
|
gem 'appraisal', '1.0.0'
|
|
8
11
|
gem 'rubocop', '0.29.0', require: false
|
|
9
12
|
gem 'coveralls', require: false
|
data/Vagrantfile
CHANGED
|
@@ -13,10 +13,6 @@ VAGRANTFILE_API_VERSION = "2"
|
|
|
13
13
|
|
|
14
14
|
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
|
15
15
|
|
|
16
|
-
# このプラグインではConoHa(OpenStack)のイメージを使用するため、boxは利用できません。
|
|
17
|
-
# このパラメータを変更する必要はありません。
|
|
18
|
-
config.vm.box = 'conoha'
|
|
19
|
-
|
|
20
16
|
# vagrantがSSH接続する際のユーザ名を指定します。
|
|
21
17
|
config.ssh.username = 'root'
|
|
22
18
|
|
|
@@ -36,8 +32,9 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
|
|
36
32
|
conoha.tenant_name = 'gnct*******'
|
|
37
33
|
|
|
38
34
|
# VPSのスペックを指定します(g-1gbの場合は1GBプランになります)。
|
|
39
|
-
#
|
|
35
|
+
# 2017/02/23現在、以下のプランが利用可能です。
|
|
40
36
|
#
|
|
37
|
+
# g-512mb
|
|
41
38
|
# g-1gb
|
|
42
39
|
# g-2gb
|
|
43
40
|
# g-4gb
|
|
@@ -46,7 +43,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
|
|
46
43
|
# g-32gb
|
|
47
44
|
# g-64gb
|
|
48
45
|
#
|
|
49
|
-
# 最新のプラン一覧はvagrantのopenstack
|
|
46
|
+
# 最新のプラン一覧はvagrantのopenstackサブコマンドで取得できます。
|
|
50
47
|
# 以下のコマンドを実行して下さい。
|
|
51
48
|
#
|
|
52
49
|
# $ vagrant openstack flavor-list
|
|
@@ -54,49 +51,12 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
|
|
54
51
|
conoha.flavor = 'g-1gb'
|
|
55
52
|
|
|
56
53
|
# VPSのイメージを指定します。
|
|
57
|
-
#
|
|
58
|
-
#
|
|
59
|
-
# vmi-archlinux-x86_64
|
|
60
|
-
# vmi-centos-6.6-i386
|
|
61
|
-
# vmi-centos-6.6-x86_64
|
|
62
|
-
# vmi-centos-6.7-i386
|
|
63
|
-
# vmi-centos-6.7-x86_64
|
|
64
|
-
# vmi-centos-7.1-x86_64
|
|
65
|
-
# vmi-concrete5-centos-6.7
|
|
66
|
-
# vmi-debian-7-amd64
|
|
67
|
-
# vmi-debian-7-i386
|
|
68
|
-
# vmi-debian-8-amd64
|
|
69
|
-
# vmi-debian-8-i386
|
|
70
|
-
# vmi-docker-1.7.1-ubuntu-14.04
|
|
71
|
-
# vmi-drupal-7.36-centos-6.6
|
|
72
|
-
# vmi-fedora-21-x86_64
|
|
73
|
-
# vmi-fedora-22-x86_64
|
|
74
|
-
# vmi-freebsd-10.1-x86_64
|
|
75
|
-
# vmi-freebsd-10.1-zfs-x86_64
|
|
76
|
-
# vmi-gitlab-7.9.1-centos-6.6
|
|
77
|
-
# vmi-hadoop-2.6-master-centos-6.6
|
|
78
|
-
# vmi-hadoop-2.6-slave-centos-6.6
|
|
79
|
-
# vmi-hinemos-5.0-centos-7.1
|
|
80
|
-
# vmi-jenkins-1.6-centos-6.6
|
|
81
|
-
# vmi-lamp-centos-6.6
|
|
82
|
-
# vmi-meanstack-centos-6.6
|
|
83
|
-
# vmi-opensuse-13.2-x86_64
|
|
84
|
-
# vmi-owncloud-8-centos-6.6
|
|
85
|
-
# vmi-redmine-3.0-centos-6.6
|
|
86
|
-
# vmi-ror-4.2-centos-6.6
|
|
87
|
-
# vmi-scientificlinux-7.1-x86_64
|
|
88
|
-
# vmi-ubuntu-12.04-amd64
|
|
89
|
-
# vmi-ubuntu-12.04-i386
|
|
90
|
-
# vmi-ubuntu-14.04-amd64
|
|
91
|
-
# vmi-ubuntu-14.04-i386
|
|
92
|
-
# vmi-wp-4.3-centos-6-6
|
|
93
|
-
#
|
|
94
|
-
# 最新のイメージ一覧は、vagrantのopenstackコマンドで取得できます。
|
|
54
|
+
# 最新のイメージ一覧は、vagrantのopenstackサブコマンドで取得できます。
|
|
95
55
|
# 以下のコマンドを実行してください。
|
|
96
56
|
#
|
|
97
57
|
# $ vagrant openstack image-list
|
|
98
58
|
#
|
|
99
|
-
conoha.image = 'vmi-ubuntu-
|
|
59
|
+
conoha.image = 'vmi-ubuntu-16.04-amd64-unified'
|
|
100
60
|
|
|
101
61
|
# リージョンを指定します。
|
|
102
62
|
# 東京(tyo1)、シンガポール(sin1)、アメリカ(sjc1)から指定して下さい。
|
|
@@ -39,7 +39,13 @@ module VagrantPlugins
|
|
|
39
39
|
else
|
|
40
40
|
b2.use Provision
|
|
41
41
|
end
|
|
42
|
-
|
|
42
|
+
if env[:machine].provider_config.use_legacy_synced_folders
|
|
43
|
+
env[:machine].ui.warn I18n.t('vagrant_openstack.config.sync_folders_deprecated')
|
|
44
|
+
b2.use SyncFolders
|
|
45
|
+
else
|
|
46
|
+
# Standard Vagrant implementation.
|
|
47
|
+
b2.use SyncedFolders
|
|
48
|
+
end
|
|
43
49
|
end
|
|
44
50
|
end
|
|
45
51
|
end
|
|
@@ -61,6 +67,7 @@ module VagrantPlugins
|
|
|
61
67
|
# key.
|
|
62
68
|
def self.action_read_state
|
|
63
69
|
new_builder.tap do |b|
|
|
70
|
+
b.use HandleBox
|
|
64
71
|
b.use ConfigValidate
|
|
65
72
|
b.use ConnectOpenstack
|
|
66
73
|
b.use ReadState
|
|
@@ -97,6 +104,7 @@ module VagrantPlugins
|
|
|
97
104
|
|
|
98
105
|
def self.action_up
|
|
99
106
|
new_builder.tap do |b|
|
|
107
|
+
b.use HandleBox
|
|
100
108
|
b.use ConfigValidate
|
|
101
109
|
b.use ConnectOpenstack
|
|
102
110
|
|
|
@@ -111,7 +119,15 @@ module VagrantPlugins
|
|
|
111
119
|
b2.use Provision
|
|
112
120
|
end
|
|
113
121
|
end
|
|
114
|
-
|
|
122
|
+
|
|
123
|
+
if env[:machine].provider_config.use_legacy_synced_folders
|
|
124
|
+
env[:machine].ui.warn I18n.t('vagrant_openstack.config.sync_folders_deprecated')
|
|
125
|
+
b2.use SyncFolders
|
|
126
|
+
else
|
|
127
|
+
# Standard Vagrant implementation.
|
|
128
|
+
b2.use SyncedFolders
|
|
129
|
+
end
|
|
130
|
+
|
|
115
131
|
b2.use CreateStack
|
|
116
132
|
b2.use CreateServer
|
|
117
133
|
b2.use Message, I18n.t('vagrant_openstack.ssh_disabled_provisioning') if ssh_disabled
|
|
@@ -99,7 +99,7 @@ module VagrantPlugins
|
|
|
99
99
|
end
|
|
100
100
|
end
|
|
101
101
|
|
|
102
|
-
log = "
|
|
102
|
+
log = "Launching server '#{server_name}' in project '#{config.tenant_name}' "
|
|
103
103
|
log << "with flavor '#{options[:flavor].name}' (#{options[:flavor].id}), "
|
|
104
104
|
unless options[:image].nil?
|
|
105
105
|
log << "image '#{options[:image].name}' (#{options[:image].id}) "
|
|
@@ -132,7 +132,7 @@ module VagrantPlugins
|
|
|
132
132
|
@logger.info "Waiting for the server with id #{server_id} to be built..."
|
|
133
133
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_for_build'))
|
|
134
134
|
config = env[:machine].provider_config
|
|
135
|
-
timeout(config.server_create_timeout, Errors::Timeout) do
|
|
135
|
+
Timeout.timeout(config.server_create_timeout, Errors::Timeout) do
|
|
136
136
|
server_status = 'WAITING'
|
|
137
137
|
until server_status == 'ACTIVE'
|
|
138
138
|
@logger.debug('Waiting for server to be ACTIVE')
|
|
@@ -60,7 +60,7 @@ module VagrantPlugins
|
|
|
60
60
|
@logger.info "Waiting for the stack with id #{stack_id} to be built..."
|
|
61
61
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_for_stack'))
|
|
62
62
|
config = env[:machine].provider_config
|
|
63
|
-
timeout(config.stack_create_timeout, Errors::Timeout) do
|
|
63
|
+
Timeout.timeout(config.stack_create_timeout, Errors::Timeout) do
|
|
64
64
|
stack_status = 'CREATE_IN_PROGRESS'
|
|
65
65
|
until stack_status == 'CREATE_COMPLETE'
|
|
66
66
|
@logger.debug('Waiting for stack to be CREATED')
|
|
@@ -32,7 +32,7 @@ module VagrantPlugins
|
|
|
32
32
|
@logger.info "Waiting for the instance with id #{instance_id} to be deleted..."
|
|
33
33
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_deleted'))
|
|
34
34
|
config = env[:machine].provider_config
|
|
35
|
-
timeout(config.server_delete_timeout, Errors::Timeout) do
|
|
35
|
+
Timeout.timeout(config.server_delete_timeout, Errors::Timeout) do
|
|
36
36
|
delete_ok = false
|
|
37
37
|
until delete_ok
|
|
38
38
|
begin
|
|
@@ -57,7 +57,7 @@ module VagrantPlugins
|
|
|
57
57
|
@logger.info "Waiting for the stack with id #{stack_id} to be deleted..."
|
|
58
58
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_for_stack_deleted'))
|
|
59
59
|
config = env[:machine].provider_config
|
|
60
|
-
timeout(config.stack_delete_timeout, Errors::Timeout) do
|
|
60
|
+
Timeout.timeout(config.stack_delete_timeout, Errors::Timeout) do
|
|
61
61
|
stack_status = 'DELETE_IN_PROGRESS'
|
|
62
62
|
until stack_status == 'DELETE_COMPLETE'
|
|
63
63
|
@logger.debug('Waiting for stack to be DELETED')
|
|
@@ -18,7 +18,7 @@ module VagrantPlugins
|
|
|
18
18
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_start'))
|
|
19
19
|
client = env[:openstack_client].nova
|
|
20
20
|
config = env[:machine].provider_config
|
|
21
|
-
timeout(config.server_active_timeout, Errors::Timeout) do
|
|
21
|
+
Timeout.timeout(config.server_active_timeout, Errors::Timeout) do
|
|
22
22
|
while client.get_server_details(env, env[:machine].id)['status'] != 'ACTIVE'
|
|
23
23
|
sleep @retry_interval
|
|
24
24
|
@logger.info('Waiting for server to be active')
|
|
@@ -18,7 +18,7 @@ module VagrantPlugins
|
|
|
18
18
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_stop'))
|
|
19
19
|
client = env[:openstack_client].nova
|
|
20
20
|
config = env[:machine].provider_config
|
|
21
|
-
timeout(config.server_stop_timeout, Errors::Timeout) do
|
|
21
|
+
Timeout.timeout(config.server_stop_timeout, Errors::Timeout) do
|
|
22
22
|
while client.get_server_details(env, env[:machine].id)['status'] != 'SHUTOFF'
|
|
23
23
|
sleep @retry_interval
|
|
24
24
|
@logger.info('Waiting for server to stop')
|
|
@@ -10,24 +10,16 @@ module VagrantPlugins
|
|
|
10
10
|
config = env[:machine].provider_config
|
|
11
11
|
client = env[:openstack_client]
|
|
12
12
|
endpoints = client.session.endpoints
|
|
13
|
-
endpoint_type = config.endpoint_type
|
|
14
13
|
@logger.info(I18n.t('vagrant_openstack.client.looking_for_available_endpoints'))
|
|
15
14
|
@logger.info("Selecting endpoints matching region '#{config.region}'") unless config.region.nil?
|
|
16
15
|
|
|
17
16
|
catalog.each do |service|
|
|
18
17
|
se = service['endpoints']
|
|
19
|
-
if config.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
end
|
|
24
|
-
url = se[0][endpoint_type].strip
|
|
25
|
-
else
|
|
26
|
-
se.each do |endpoint|
|
|
27
|
-
url = endpoint[endpoint_type].strip if endpoint['region'].eql? config.region
|
|
28
|
-
end
|
|
18
|
+
if config.identity_api_version == '2'
|
|
19
|
+
get_endpoints_2(env, se, service, config, endpoints)
|
|
20
|
+
elsif config.identity_api_version == '3'
|
|
21
|
+
get_interfaces_3(se, service, config, endpoints)
|
|
29
22
|
end
|
|
30
|
-
endpoints[service['type'].to_sym] = url unless url.nil? || url.empty?
|
|
31
23
|
end
|
|
32
24
|
|
|
33
25
|
endpoints[:network] = choose_api_version('Neutron', 'openstack_network_url', 'v2') do
|
|
@@ -41,6 +33,37 @@ module VagrantPlugins
|
|
|
41
33
|
|
|
42
34
|
private
|
|
43
35
|
|
|
36
|
+
def get_endpoints_2(env, se, service, config, endpoints)
|
|
37
|
+
endpoint_type = config.endpoint_type
|
|
38
|
+
if config.region.nil?
|
|
39
|
+
if se.size > 1
|
|
40
|
+
env[:ui].warn I18n.t('vagrant_openstack.client.multiple_endpoint', size: se.size, type: service['type'])
|
|
41
|
+
env[:ui].warn " => #{service['endpoints'][0][endpoint_type]}"
|
|
42
|
+
end
|
|
43
|
+
url = se[0][endpoint_type].strip
|
|
44
|
+
else
|
|
45
|
+
se.each do |endpoint|
|
|
46
|
+
url = endpoint[endpoint_type].strip if endpoint['region'].eql? config.region
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
endpoints[service['type'].to_sym] = url unless url.nil? || url.empty?
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def get_interfaces_3(se, service, config, endpoints)
|
|
53
|
+
url = nil
|
|
54
|
+
se.each do |endpoint|
|
|
55
|
+
next if endpoint['interface'] != config.interface_type
|
|
56
|
+
if config.region.nil?
|
|
57
|
+
url = endpoint['url']
|
|
58
|
+
break
|
|
59
|
+
elsif endpoint['region'] == config.region
|
|
60
|
+
url = endpoint['url']
|
|
61
|
+
break
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
endpoints[service['type'].to_sym] = url unless url.nil? || url.empty?
|
|
65
|
+
end
|
|
66
|
+
|
|
44
67
|
def choose_api_version(service_name, url_property, version_prefix = nil, fail_if_not_found = true)
|
|
45
68
|
versions = yield
|
|
46
69
|
|
|
@@ -19,20 +19,13 @@ module VagrantPlugins
|
|
|
19
19
|
config = env[:machine].provider_config
|
|
20
20
|
@logger.info(I18n.t('vagrant_openstack.client.authentication', project: config.tenant_name, user: config.username))
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
username: config.username,
|
|
30
|
-
password: '****'
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
auth_url = get_auth_url_v2 env
|
|
22
|
+
if config.identity_api_version == '2'
|
|
23
|
+
post_body = get_body_2 config
|
|
24
|
+
auth_url = get_auth_url_2 env
|
|
25
|
+
elsif config.identity_api_version == '3'
|
|
26
|
+
post_body = get_body_3 config
|
|
27
|
+
auth_url = get_auth_url_3 env
|
|
28
|
+
end
|
|
36
29
|
|
|
37
30
|
headers = {
|
|
38
31
|
content_type: :json,
|
|
@@ -41,13 +34,19 @@ module VagrantPlugins
|
|
|
41
34
|
|
|
42
35
|
log_request(:POST, auth_url, post_body.to_json, headers)
|
|
43
36
|
|
|
44
|
-
|
|
37
|
+
if config.identity_api_version == '2'
|
|
38
|
+
post_body[:auth][:passwordCredentials][:password] = config.password
|
|
39
|
+
elsif config.identity_api_version == '3'
|
|
40
|
+
post_body[:auth][:identity][:password][:user][:password] = config.password
|
|
41
|
+
end
|
|
45
42
|
|
|
46
43
|
authentication = RestUtils.post(env, auth_url, post_body.to_json, headers) do |response|
|
|
47
44
|
log_response(response)
|
|
48
45
|
case response.code
|
|
49
46
|
when 200
|
|
50
47
|
response
|
|
48
|
+
when 201
|
|
49
|
+
response
|
|
51
50
|
when 401
|
|
52
51
|
fail Errors::AuthenticationFailed
|
|
53
52
|
when 404
|
|
@@ -57,17 +56,69 @@ module VagrantPlugins
|
|
|
57
56
|
end
|
|
58
57
|
end
|
|
59
58
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
59
|
+
if config.identity_api_version == '2'
|
|
60
|
+
access = JSON.parse(authentication)['access']
|
|
61
|
+
response_token = access['token']
|
|
62
|
+
@session.token = response_token['id']
|
|
63
|
+
@session.project_id = response_token['tenant']['id']
|
|
64
|
+
return access['serviceCatalog']
|
|
65
|
+
elsif config.identity_api_version == '3'
|
|
66
|
+
body = JSON.parse(authentication)
|
|
67
|
+
@session.token = authentication.headers[:x_subject_token]
|
|
68
|
+
@session.project_id = body['token']['project']['id']
|
|
69
|
+
return body['token']['catalog']
|
|
70
|
+
end
|
|
66
71
|
end
|
|
67
72
|
|
|
68
73
|
private
|
|
69
74
|
|
|
70
|
-
def
|
|
75
|
+
def get_body_2(config)
|
|
76
|
+
{
|
|
77
|
+
auth:
|
|
78
|
+
{
|
|
79
|
+
tenantName: config.tenant_name,
|
|
80
|
+
passwordCredentials:
|
|
81
|
+
{
|
|
82
|
+
username: config.username,
|
|
83
|
+
password: '****'
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def get_body_3(config)
|
|
90
|
+
{
|
|
91
|
+
auth:
|
|
92
|
+
{
|
|
93
|
+
identity: {
|
|
94
|
+
methods: ['password'],
|
|
95
|
+
password: {
|
|
96
|
+
user: {
|
|
97
|
+
name: config.username,
|
|
98
|
+
domain: {
|
|
99
|
+
name: config.domain_name
|
|
100
|
+
},
|
|
101
|
+
password: '****'
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
scope: {
|
|
106
|
+
project: {
|
|
107
|
+
name: config.project_name,
|
|
108
|
+
domain: { name: config.domain_name }
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def get_auth_url_3(env)
|
|
116
|
+
url = env[:machine].provider_config.openstack_auth_url
|
|
117
|
+
return url if url.match(%r{/tokens/*$})
|
|
118
|
+
"#{url}/auth/tokens"
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def get_auth_url_2(env)
|
|
71
122
|
url = env[:machine].provider_config.openstack_auth_url
|
|
72
123
|
return url if url.match(%r{/tokens/*$})
|
|
73
124
|
"#{url}/tokens"
|
|
@@ -52,6 +52,11 @@ module VagrantPlugins
|
|
|
52
52
|
#
|
|
53
53
|
attr_accessor :tenant_name
|
|
54
54
|
|
|
55
|
+
#
|
|
56
|
+
# The name of the openstack project on witch the vm will be created, changed name in v3 identity API.
|
|
57
|
+
#
|
|
58
|
+
attr_accessor :project_name
|
|
59
|
+
|
|
55
60
|
# The name of the server. This defaults to the name of the machine
|
|
56
61
|
# defined by Vagrant (via `config.vm.define`), but can be overriden
|
|
57
62
|
# here.
|
|
@@ -62,6 +67,11 @@ module VagrantPlugins
|
|
|
62
67
|
# @return [String]
|
|
63
68
|
attr_accessor :username
|
|
64
69
|
|
|
70
|
+
# The domain name to access Openstack, this defaults to Default.
|
|
71
|
+
#
|
|
72
|
+
# @return [String]
|
|
73
|
+
attr_accessor :domain_name
|
|
74
|
+
|
|
65
75
|
# The name of the keypair to use.
|
|
66
76
|
#
|
|
67
77
|
# @return [String]
|
|
@@ -87,6 +97,8 @@ module VagrantPlugins
|
|
|
87
97
|
|
|
88
98
|
# Opt files/directories in to the rsync operation performed by this provider
|
|
89
99
|
#
|
|
100
|
+
# @deprecated Use standard Vagrant synced folders instead.
|
|
101
|
+
#
|
|
90
102
|
# @return [Array]
|
|
91
103
|
attr_accessor :rsync_includes
|
|
92
104
|
|
|
@@ -108,12 +120,16 @@ module VagrantPlugins
|
|
|
108
120
|
|
|
109
121
|
# Sync folder method. Can be either "rsync" or "none"
|
|
110
122
|
#
|
|
123
|
+
# @deprecated Use standard Vagrant synced folders instead.
|
|
124
|
+
#
|
|
111
125
|
# @return [String]
|
|
112
126
|
attr_accessor :sync_method
|
|
113
127
|
|
|
114
128
|
# Sync folder ignore files. A list of files containing exclude patterns to ignore in the rsync operation
|
|
115
129
|
# performed by this provider
|
|
116
130
|
#
|
|
131
|
+
# @deprecated Use standard Vagrant synced folders instead.
|
|
132
|
+
#
|
|
117
133
|
# @return [Array]
|
|
118
134
|
attr_accessor :rsync_ignore_files
|
|
119
135
|
|
|
@@ -172,6 +188,16 @@ module VagrantPlugins
|
|
|
172
188
|
# @return [String]
|
|
173
189
|
attr_accessor :endpoint_type
|
|
174
190
|
|
|
191
|
+
# Specify the endpoint_type to use : publicL, admin, or internal (default is public)
|
|
192
|
+
#
|
|
193
|
+
# @return [String]
|
|
194
|
+
attr_accessor :interface_type
|
|
195
|
+
|
|
196
|
+
# Specify the authentication version to use : 2 or 3 (ddefault is 2()
|
|
197
|
+
#
|
|
198
|
+
# @return [String]
|
|
199
|
+
attr_accessor :identity_api_version
|
|
200
|
+
|
|
175
201
|
#
|
|
176
202
|
# @return [Integer]
|
|
177
203
|
attr_accessor :server_create_timeout
|
|
@@ -204,6 +230,20 @@ module VagrantPlugins
|
|
|
204
230
|
# @return [Boolean]
|
|
205
231
|
attr_accessor :meta_args_support
|
|
206
232
|
|
|
233
|
+
# A switch for enabling the legacy synced folders implementation.
|
|
234
|
+
#
|
|
235
|
+
# This defaults to false, but is automatically set to true if any of the
|
|
236
|
+
# legacy synced folder options are used:
|
|
237
|
+
#
|
|
238
|
+
# - {#rsync_includes}
|
|
239
|
+
# - {#rsync_ignore_files}
|
|
240
|
+
# - {#sync_method}
|
|
241
|
+
#
|
|
242
|
+
# @deprecated Use standard Vagrant synced folders instead.
|
|
243
|
+
#
|
|
244
|
+
# @return [Boolean]
|
|
245
|
+
attr_accessor :use_legacy_synced_folders
|
|
246
|
+
|
|
207
247
|
def initialize
|
|
208
248
|
@password = UNSET_VALUE
|
|
209
249
|
@openstack_compute_url = UNSET_VALUE
|
|
@@ -213,6 +253,8 @@ module VagrantPlugins
|
|
|
213
253
|
@openstack_image_url = UNSET_VALUE
|
|
214
254
|
@openstack_auth_url = UNSET_VALUE
|
|
215
255
|
@endpoint_type = UNSET_VALUE
|
|
256
|
+
@interface_type = UNSET_VALUE
|
|
257
|
+
@identity_api_version = UNSET_VALUE
|
|
216
258
|
@region = UNSET_VALUE
|
|
217
259
|
@flavor = UNSET_VALUE
|
|
218
260
|
@image = UNSET_VALUE
|
|
@@ -248,6 +290,7 @@ module VagrantPlugins
|
|
|
248
290
|
@stack_delete_timeout = UNSET_VALUE
|
|
249
291
|
@meta_args_support = UNSET_VALUE
|
|
250
292
|
@http = HttpConfig.new
|
|
293
|
+
@use_legacy_synced_folders = UNSET_VALUE
|
|
251
294
|
end
|
|
252
295
|
|
|
253
296
|
def merge(other)
|
|
@@ -288,7 +331,7 @@ module VagrantPlugins
|
|
|
288
331
|
result
|
|
289
332
|
end
|
|
290
333
|
|
|
291
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
|
334
|
+
# rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
|
292
335
|
def finalize!
|
|
293
336
|
@password = nil if @password == UNSET_VALUE
|
|
294
337
|
@openstack_compute_url = nil if @openstack_compute_url == UNSET_VALUE
|
|
@@ -298,19 +341,20 @@ module VagrantPlugins
|
|
|
298
341
|
@openstack_image_url = nil if @openstack_image_url == UNSET_VALUE
|
|
299
342
|
@openstack_auth_url = nil if @openstack_auth_url == UNSET_VALUE
|
|
300
343
|
@endpoint_type = 'publicURL' if @endpoint_type == UNSET_VALUE
|
|
344
|
+
@interface_type = 'public' if @interface_type == UNSET_VALUE
|
|
345
|
+
@identity_api_version = '2' if @identity_api_version == UNSET_VALUE
|
|
301
346
|
@region = nil if @region == UNSET_VALUE
|
|
302
347
|
@flavor = nil if @flavor == UNSET_VALUE
|
|
303
348
|
@image = nil if @image == UNSET_VALUE
|
|
304
349
|
@volume_boot = nil if @volume_boot == UNSET_VALUE
|
|
305
350
|
@tenant_name = nil if @tenant_name == UNSET_VALUE
|
|
351
|
+
@project_name = nil if @project_name == UNSET_VALUE
|
|
306
352
|
@server_name = nil if @server_name == UNSET_VALUE
|
|
307
353
|
@username = nil if @username == UNSET_VALUE
|
|
308
|
-
@
|
|
309
|
-
@rsync_ignore_files = nil if @rsync_ignore_files.empty?
|
|
354
|
+
@domain_name = 'Default' if @domain_name == UNSET_VALUE
|
|
310
355
|
@floating_ip = nil if @floating_ip == UNSET_VALUE
|
|
311
356
|
@floating_ip_pool = nil if @floating_ip_pool == UNSET_VALUE
|
|
312
357
|
@floating_ip_pool_always_allocate = false if floating_ip_pool_always_allocate == UNSET_VALUE
|
|
313
|
-
@sync_method = 'rsync' if @sync_method == UNSET_VALUE
|
|
314
358
|
@keypair_name = nil if @keypair_name == UNSET_VALUE
|
|
315
359
|
@admin_pass = nil if @admin_pass == UNSET_VALUE
|
|
316
360
|
@public_key_path = nil if @public_key_path == UNSET_VALUE
|
|
@@ -321,6 +365,27 @@ module VagrantPlugins
|
|
|
321
365
|
@metadata = nil if @metadata == UNSET_VALUE
|
|
322
366
|
@ssh_disabled = false if @ssh_disabled == UNSET_VALUE
|
|
323
367
|
|
|
368
|
+
# The value of use_legacy_synced_folders is used by action chains
|
|
369
|
+
# to determine which synced folder implementation to run.
|
|
370
|
+
if @use_legacy_synced_folders == UNSET_VALUE
|
|
371
|
+
@use_legacy_synced_folders = !(
|
|
372
|
+
(@rsync_includes.nil? || @rsync_includes.empty?) &&
|
|
373
|
+
(@rsync_ignore_files.nil? || @rsync_ignore_files.empty?) &&
|
|
374
|
+
(@sync_method.nil? || @sync_method == UNSET_VALUE))
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
if @use_legacy_synced_folders
|
|
378
|
+
# Original defaults.
|
|
379
|
+
@rsync_includes = nil if @rsync_includes.empty?
|
|
380
|
+
@rsync_ignore_files = nil if @rsync_ignore_files.empty?
|
|
381
|
+
@sync_method = 'rsync' if @sync_method == UNSET_VALUE
|
|
382
|
+
else
|
|
383
|
+
# Disable all sync settings.
|
|
384
|
+
@rsync_includes = nil
|
|
385
|
+
@rsync_ignore_files = nil
|
|
386
|
+
@sync_method = nil
|
|
387
|
+
end
|
|
388
|
+
|
|
324
389
|
# The SSH values by default are nil, and the top-level config
|
|
325
390
|
# `config.ssh` and `config.vm.boot_timeout` values are used.
|
|
326
391
|
@ssh_username = nil if @ssh_username == UNSET_VALUE
|
|
@@ -338,8 +403,10 @@ module VagrantPlugins
|
|
|
338
403
|
@stacks = nil if @stacks.empty?
|
|
339
404
|
@http.finalize!
|
|
340
405
|
end
|
|
341
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
|
406
|
+
# rubocop:enable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
|
342
407
|
|
|
408
|
+
#
|
|
409
|
+
# @deprecated Use standard Vagrant synced folders instead.
|
|
343
410
|
def rsync_include(inc)
|
|
344
411
|
@rsync_includes << inc
|
|
345
412
|
end
|
|
@@ -349,13 +416,12 @@ module VagrantPlugins
|
|
|
349
416
|
|
|
350
417
|
errors << I18n.t('vagrant_openstack.config.password_required') if @password.nil? || @password.empty?
|
|
351
418
|
errors << I18n.t('vagrant_openstack.config.username_required') if @username.nil? || @username.empty?
|
|
352
|
-
errors << I18n.t('vagrant_openstack.config.
|
|
353
|
-
errors << I18n.t('vagrant_openstack.config.invalid_endpoint_type') unless %w(publicURL adminURL internalURL).include?(@endpoint_type)
|
|
419
|
+
errors << I18n.t('vagrant_openstack.config.invalid_api_version') unless %w(2 3).include?(@identity_api_version)
|
|
354
420
|
|
|
421
|
+
validate_api_version(errors)
|
|
355
422
|
validate_ssh_username(machine, errors)
|
|
356
423
|
validate_stack_config(errors)
|
|
357
424
|
validate_ssh_timeout(errors)
|
|
358
|
-
validate_admin_pass(errors)
|
|
359
425
|
|
|
360
426
|
if machine.config.ssh.private_key_path
|
|
361
427
|
puts I18n.t('vagrant_openstack.config.keypair_name_required').yellow unless @keypair_name || @public_key_path
|
|
@@ -379,11 +445,15 @@ module VagrantPlugins
|
|
|
379
445
|
|
|
380
446
|
private
|
|
381
447
|
|
|
382
|
-
def
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
448
|
+
def validate_api_version(errors)
|
|
449
|
+
if @identity_api_version == '2'
|
|
450
|
+
errors << I18n.t('vagrant_openstack.config.tenant_name_required') if @tenant_name.nil? || @tenant_name.empty?
|
|
451
|
+
errors << I18n.t('vagrant_openstack.config.invalid_endpoint_type') unless %w(publicURL adminURL internalURL).include?(@endpoint_type)
|
|
452
|
+
elsif @identity_api_version == '3'
|
|
453
|
+
errors << I18n.t('vagrant_openstack.config.domain_required') if @domain_name.nil? || @domain_name.empty?
|
|
454
|
+
errors << I18n.t('vagrant_openstack.config.project_name_required') if @project_name.nil? || @project_name.empty?
|
|
455
|
+
errors << I18n.t('vagrant_openstack.config.invalid_interface_type') unless %w(public admin internal).include?(@interface_type)
|
|
456
|
+
end
|
|
387
457
|
end
|
|
388
458
|
|
|
389
459
|
def validate_stack_config(errors)
|
data/lib/vagrant-conoha/utils.rb
CHANGED
|
@@ -16,7 +16,12 @@ module VagrantPlugins
|
|
|
16
16
|
if addresses.size == 1
|
|
17
17
|
net_addresses = addresses.first[1]
|
|
18
18
|
else
|
|
19
|
-
|
|
19
|
+
first_network = env[:machine].provider_config.networks[0]
|
|
20
|
+
if first_network.is_a? String
|
|
21
|
+
net_addresses = addresses[first_network]
|
|
22
|
+
else
|
|
23
|
+
net_addresses = addresses[first_network[:name]]
|
|
24
|
+
end
|
|
20
25
|
end
|
|
21
26
|
fail Errors::UnableToResolveIP if net_addresses.size == 0
|
|
22
27
|
net_addresses[0]['addr']
|
data/locales/en.yml
CHANGED
|
@@ -140,8 +140,19 @@ en:
|
|
|
140
140
|
to the standard vagrant configuration option `config.vm.boot_timeout`.
|
|
141
141
|
invalid_value_for_parameter: |-
|
|
142
142
|
Invalid value '%{value}' for parameter '%{parameter}'
|
|
143
|
-
|
|
144
|
-
|
|
143
|
+
sync_folders_deprecated: |-
|
|
144
|
+
The following configuration settings are deprecated and should be
|
|
145
|
+
removed: rsync_includes, rsync_ignore_files, sync_method. Using these
|
|
146
|
+
settings causes the OpenStack provider to fall back to an old synced
|
|
147
|
+
folder implementation instead of using standard Vagrant synced folders.
|
|
148
|
+
domain_required: |-
|
|
149
|
+
A domain is required when using identity API version 3
|
|
150
|
+
project_name_required: |-
|
|
151
|
+
A project name is required when using identity API version 3
|
|
152
|
+
invalid_interface_type: |-
|
|
153
|
+
Interface type must be public, admin or internal (if not provided, default is public)
|
|
154
|
+
invalid_api_version: |-
|
|
155
|
+
identity API verison must be 2 or 3 (if nto provided, default is 2)
|
|
145
156
|
|
|
146
157
|
errors:
|
|
147
158
|
default: |-
|
|
@@ -18,10 +18,13 @@ describe VagrantPlugins::ConoHa::Action::ConnectOpenstack do
|
|
|
18
18
|
config.stub(:openstack_volume_url) { nil }
|
|
19
19
|
config.stub(:openstack_image_url) { nil }
|
|
20
20
|
config.stub(:tenant_name) { 'testTenant' }
|
|
21
|
+
config.stub(:project_name) { 'testTenant' }
|
|
21
22
|
config.stub(:username) { 'username' }
|
|
22
23
|
config.stub(:password) { 'password' }
|
|
23
24
|
config.stub(:region) { nil }
|
|
24
25
|
config.stub(:endpoint_type) { 'publicURL' }
|
|
26
|
+
config.stub(:interface_type) { 'public' }
|
|
27
|
+
config.stub(:identity_api_version) { '2' }
|
|
25
28
|
end
|
|
26
29
|
end
|
|
27
30
|
|
|
@@ -243,6 +246,78 @@ describe VagrantPlugins::ConoHa::Action::ConnectOpenstack do
|
|
|
243
246
|
end
|
|
244
247
|
end
|
|
245
248
|
|
|
249
|
+
context 'with one endpoint by service v3' do
|
|
250
|
+
it 'read service catalog and stores endpoints URL in session v3' do
|
|
251
|
+
catalog = [
|
|
252
|
+
{
|
|
253
|
+
'endpoints' => [
|
|
254
|
+
{
|
|
255
|
+
'url' => 'http://nova/v2/projectId',
|
|
256
|
+
'interface' => 'public',
|
|
257
|
+
'region' => 'RegionOne',
|
|
258
|
+
'id' => '1'
|
|
259
|
+
}
|
|
260
|
+
],
|
|
261
|
+
'type' => 'compute',
|
|
262
|
+
'name' => 'nova'
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
'endpoints' => [
|
|
266
|
+
{
|
|
267
|
+
'url' => 'http://neutron',
|
|
268
|
+
'interface' => 'public',
|
|
269
|
+
'region' => 'RegionOne',
|
|
270
|
+
'id' => '2'
|
|
271
|
+
}
|
|
272
|
+
],
|
|
273
|
+
'type' => 'network',
|
|
274
|
+
'name' => 'neutron'
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
'endpoints' => [
|
|
278
|
+
{
|
|
279
|
+
'url' => 'http://cinder/v2/projectId',
|
|
280
|
+
'interface' => 'public',
|
|
281
|
+
'region' => 'RegionOne',
|
|
282
|
+
'id' => '2'
|
|
283
|
+
}
|
|
284
|
+
],
|
|
285
|
+
'type' => 'volume',
|
|
286
|
+
'name' => 'cinder'
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
'endpoints' => [
|
|
290
|
+
{
|
|
291
|
+
'url' => 'http://glance',
|
|
292
|
+
'interface' => 'public',
|
|
293
|
+
'region' => 'RegionOne',
|
|
294
|
+
'id' => '2'
|
|
295
|
+
}
|
|
296
|
+
],
|
|
297
|
+
'type' => 'image',
|
|
298
|
+
'name' => 'glance'
|
|
299
|
+
}
|
|
300
|
+
]
|
|
301
|
+
|
|
302
|
+
double.tap do |keystone|
|
|
303
|
+
keystone.stub(:authenticate).with(anything) { catalog }
|
|
304
|
+
env[:openstack_client].stub(:keystone) { keystone }
|
|
305
|
+
end
|
|
306
|
+
env[:openstack_client].stub(:neutron) { neutron }
|
|
307
|
+
env[:openstack_client].stub(:glance) { glance }
|
|
308
|
+
config.stub(:domain_name) { 'dummy' }
|
|
309
|
+
config.stub(:identity_api_version) { '3' }
|
|
310
|
+
|
|
311
|
+
@action.call(env)
|
|
312
|
+
|
|
313
|
+
expect(env[:openstack_client].session.endpoints)
|
|
314
|
+
.to eq(compute: 'http://nova/v2/projectId',
|
|
315
|
+
network: 'http://neutron/v2.0',
|
|
316
|
+
volume: 'http://cinder/v2/projectId',
|
|
317
|
+
image: 'http://glance/v2.0')
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
|
|
246
321
|
context 'with multiple regions' do
|
|
247
322
|
it 'read service catalog and stores endpoints URL for desired regions in session' do
|
|
248
323
|
catalog = [
|
|
@@ -17,6 +17,9 @@ describe VagrantPlugins::ConoHa::KeystoneClient do
|
|
|
17
17
|
config.stub(:username) { 'username' }
|
|
18
18
|
config.stub(:password) { 'password' }
|
|
19
19
|
config.stub(:http) { http }
|
|
20
|
+
config.stub(:interface_type) { 'public' }
|
|
21
|
+
config.stub(:identity_api_version) { '2' }
|
|
22
|
+
config.stub(:project_name) { 'testTenant' }
|
|
20
23
|
end
|
|
21
24
|
end
|
|
22
25
|
|
|
@@ -52,6 +55,29 @@ describe VagrantPlugins::ConoHa::KeystoneClient do
|
|
|
52
55
|
]}}'
|
|
53
56
|
end
|
|
54
57
|
|
|
58
|
+
let(:keystone_response_headers_v3) do
|
|
59
|
+
{
|
|
60
|
+
'Accept' => 'application/json',
|
|
61
|
+
'Content-Type' => 'application/json',
|
|
62
|
+
'x_subject_token' => '0123456789'
|
|
63
|
+
}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
let(:keystone_request_body_v3) do
|
|
67
|
+
'{"auth":{"identity":{"methods":["password"],"password":{"user":{"name":"username","domain":'\
|
|
68
|
+
'{"name":"dummy"},"password":"password"}}},"scope":{"project":{"name":"testTenant","domain":'\
|
|
69
|
+
'{"name":"dummy"}}}}}'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
let(:keystone_response_body_v3) do
|
|
73
|
+
'{"token":{"is_domain":false,"methods":["password"],"roles":[{"id":"1234","name":"_member_"}],
|
|
74
|
+
"is_admin_project":false,"project":{"domain":{"id":"1234","name":"dummy"},"id":"012345678910",
|
|
75
|
+
"name":"testTenantId"},"catalog":[
|
|
76
|
+
{"endpoints":[{"id":"eid1","interface":"public","url":"http://nova"}],"type":"compute"},
|
|
77
|
+
{"endpoints":[{"id":"eid2","interface":"public","url":"http://neutron"}],"type":"network"}
|
|
78
|
+
]}}'
|
|
79
|
+
end
|
|
80
|
+
|
|
55
81
|
before :each do
|
|
56
82
|
@keystone_client = VagrantPlugins::ConoHa.keystone
|
|
57
83
|
end
|
|
@@ -146,5 +172,53 @@ describe VagrantPlugins::ConoHa::KeystoneClient do
|
|
|
146
172
|
end
|
|
147
173
|
end
|
|
148
174
|
end
|
|
175
|
+
|
|
176
|
+
# V3
|
|
177
|
+
context 'with good credentials v3' do
|
|
178
|
+
it 'store token and tenant id' do
|
|
179
|
+
config.stub(:domain_name) { 'dummy' }
|
|
180
|
+
config.stub(:identity_api_version) { '3' }
|
|
181
|
+
config.stub(:openstack_auth_url) { 'http://keystoneAuthV3' }
|
|
182
|
+
|
|
183
|
+
stub_request(:post, 'http://keystoneAuthV3/auth/tokens')
|
|
184
|
+
.with(
|
|
185
|
+
body: keystone_request_body_v3,
|
|
186
|
+
headers: keystone_request_headers)
|
|
187
|
+
.to_return(
|
|
188
|
+
status: 200,
|
|
189
|
+
body: keystone_response_body_v3,
|
|
190
|
+
headers: keystone_response_headers_v3)
|
|
191
|
+
|
|
192
|
+
@keystone_client.authenticate(env)
|
|
193
|
+
|
|
194
|
+
session.token.should eq('0123456789')
|
|
195
|
+
session.project_id.should eq('012345678910')
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
context 'with wrong credentials v3' do
|
|
200
|
+
it 'raise an unauthorized error ' do
|
|
201
|
+
config.stub(:domain_name) { 'dummy' }
|
|
202
|
+
config.stub(:identity_api_version) { '3' }
|
|
203
|
+
config.stub(:openstack_auth_url) { 'http://keystoneAuthV3' }
|
|
204
|
+
|
|
205
|
+
stub_request(:post, 'http://keystoneAuthV3/auth/tokens')
|
|
206
|
+
.with(
|
|
207
|
+
body: keystone_request_body_v3,
|
|
208
|
+
headers: keystone_request_headers)
|
|
209
|
+
.to_return(
|
|
210
|
+
status: 401,
|
|
211
|
+
body: '{
|
|
212
|
+
"error": {
|
|
213
|
+
"message": "The request you have made requires authentication.",
|
|
214
|
+
"code": 401,
|
|
215
|
+
"title": "Unauthorized"
|
|
216
|
+
}
|
|
217
|
+
}',
|
|
218
|
+
headers: keystone_response_headers_v3)
|
|
219
|
+
|
|
220
|
+
expect { @keystone_client.authenticate(env) }.to raise_error(Errors::AuthenticationFailed)
|
|
221
|
+
end
|
|
222
|
+
end
|
|
149
223
|
end
|
|
150
224
|
end
|
|
@@ -460,7 +460,7 @@ describe VagrantPlugins::ConoHa::NovaClient do
|
|
|
460
460
|
{
|
|
461
461
|
'Accept' => 'application/json',
|
|
462
462
|
'Accept-Encoding' => 'gzip, deflate',
|
|
463
|
-
'User-Agent' =>
|
|
463
|
+
'User-Agent' => /.*/,
|
|
464
464
|
'X-Auth-Token' => '123456'
|
|
465
465
|
})
|
|
466
466
|
.to_return(status: 200, body: '
|
|
@@ -16,7 +16,10 @@ describe VagrantPlugins::ConoHa::Config do
|
|
|
16
16
|
its(:image) { should be_nil }
|
|
17
17
|
its(:server_name) { should be_nil }
|
|
18
18
|
its(:username) { should be_nil }
|
|
19
|
+
its(:use_legacy_synced_folders) { should eq(false) }
|
|
19
20
|
its(:rsync_includes) { should be_nil }
|
|
21
|
+
its(:rsync_ignore_files) { should be_nil }
|
|
22
|
+
its(:sync_method) { should be_nil }
|
|
20
23
|
its(:keypair_name) { should be_nil }
|
|
21
24
|
its(:public_key_path) { should be_nil }
|
|
22
25
|
its(:availability_zone) { should be_nil }
|
|
@@ -55,11 +58,36 @@ describe VagrantPlugins::ConoHa::Config do
|
|
|
55
58
|
end
|
|
56
59
|
end
|
|
57
60
|
|
|
61
|
+
describe 'use_legacy_synced_folders' do
|
|
62
|
+
it 'should default to true if sync_method is set' do
|
|
63
|
+
subject.sync_method = 'rsync'
|
|
64
|
+
subject.finalize!
|
|
65
|
+
|
|
66
|
+
expect(subject.use_legacy_synced_folders).to eq(true)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'should default to true if rsync_includes is non-empty' do
|
|
70
|
+
subject.rsync_includes = ['some/file']
|
|
71
|
+
subject.finalize!
|
|
72
|
+
|
|
73
|
+
expect(subject.use_legacy_synced_folders).to eq(true)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it 'should default to true if rsync_ignore_files is non-empty' do
|
|
77
|
+
subject.rsync_ignore_files = ['some/file']
|
|
78
|
+
subject.finalize!
|
|
79
|
+
|
|
80
|
+
expect(subject.use_legacy_synced_folders).to eq(true)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
58
84
|
it 'should not default rsync_includes if overridden' do
|
|
59
85
|
inc = 'core'
|
|
60
86
|
subject.send(:rsync_include, inc)
|
|
61
87
|
subject.finalize!
|
|
62
|
-
|
|
88
|
+
|
|
89
|
+
expect(subject.rsync_includes).to include(inc)
|
|
90
|
+
expect(subject.use_legacy_synced_folders).to eq(true)
|
|
63
91
|
end
|
|
64
92
|
end
|
|
65
93
|
|
data/vagrant-conoha.gemspec
CHANGED
|
@@ -12,13 +12,15 @@ Gem::Specification.new do |gem|
|
|
|
12
12
|
gem.homepage = 'https://github.com/hironobu-s/vagrant-conoha/'
|
|
13
13
|
gem.license = 'MIT'
|
|
14
14
|
|
|
15
|
-
gem.add_dependency 'json', '1.8.3'
|
|
16
|
-
gem.add_dependency 'rest-client', '
|
|
15
|
+
gem.add_dependency 'json', '>= 1.8.1', '< 3.0'
|
|
16
|
+
gem.add_dependency 'rest-client', '>= 1.6.0', '< 3.0'
|
|
17
17
|
gem.add_dependency 'terminal-table', '1.4.5'
|
|
18
18
|
gem.add_dependency 'sshkey', '1.6.1'
|
|
19
19
|
gem.add_dependency 'colorize', '0.7.3'
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
# Constraint rake to properly handle deprecated method usage
|
|
22
|
+
# from within rspec 3.1.z
|
|
23
|
+
gem.add_development_dependency 'rake', '~> 11.3.0'
|
|
22
24
|
gem.add_development_dependency 'rspec', '~> 3.1.0'
|
|
23
25
|
gem.add_development_dependency 'rspec-its', '~> 1.0.1'
|
|
24
26
|
gem.add_development_dependency 'rspec-expectations', '~> 3.1.2'
|
metadata
CHANGED
|
@@ -1,43 +1,55 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: vagrant-conoha
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Hironobu Saitoh
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2017-02-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: json
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- -
|
|
17
|
+
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 1.8.
|
|
19
|
+
version: 1.8.1
|
|
20
|
+
- - "<"
|
|
21
|
+
- !ruby/object:Gem::Version
|
|
22
|
+
version: '3.0'
|
|
20
23
|
type: :runtime
|
|
21
24
|
prerelease: false
|
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
26
|
requirements:
|
|
24
|
-
- -
|
|
27
|
+
- - ">="
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: 1.8.1
|
|
30
|
+
- - "<"
|
|
25
31
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
32
|
+
version: '3.0'
|
|
27
33
|
- !ruby/object:Gem::Dependency
|
|
28
34
|
name: rest-client
|
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
|
30
36
|
requirements:
|
|
31
|
-
- - "
|
|
37
|
+
- - ">="
|
|
32
38
|
- !ruby/object:Gem::Version
|
|
33
39
|
version: 1.6.0
|
|
40
|
+
- - "<"
|
|
41
|
+
- !ruby/object:Gem::Version
|
|
42
|
+
version: '3.0'
|
|
34
43
|
type: :runtime
|
|
35
44
|
prerelease: false
|
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
46
|
requirements:
|
|
38
|
-
- - "
|
|
47
|
+
- - ">="
|
|
39
48
|
- !ruby/object:Gem::Version
|
|
40
49
|
version: 1.6.0
|
|
50
|
+
- - "<"
|
|
51
|
+
- !ruby/object:Gem::Version
|
|
52
|
+
version: '3.0'
|
|
41
53
|
- !ruby/object:Gem::Dependency
|
|
42
54
|
name: terminal-table
|
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -84,16 +96,16 @@ dependencies:
|
|
|
84
96
|
name: rake
|
|
85
97
|
requirement: !ruby/object:Gem::Requirement
|
|
86
98
|
requirements:
|
|
87
|
-
- - "
|
|
99
|
+
- - "~>"
|
|
88
100
|
- !ruby/object:Gem::Version
|
|
89
|
-
version:
|
|
101
|
+
version: 11.3.0
|
|
90
102
|
type: :development
|
|
91
103
|
prerelease: false
|
|
92
104
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
105
|
requirements:
|
|
94
|
-
- - "
|
|
106
|
+
- - "~>"
|
|
95
107
|
- !ruby/object:Gem::Version
|
|
96
|
-
version:
|
|
108
|
+
version: 11.3.0
|
|
97
109
|
- !ruby/object:Gem::Dependency
|
|
98
110
|
name: rspec
|
|
99
111
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -300,7 +312,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
300
312
|
version: '0'
|
|
301
313
|
requirements: []
|
|
302
314
|
rubyforge_project:
|
|
303
|
-
rubygems_version: 2.
|
|
315
|
+
rubygems_version: 2.5.1
|
|
304
316
|
signing_key:
|
|
305
317
|
specification_version: 4
|
|
306
318
|
summary: Enables Vagrant to manage VPS in ConoHa.
|