vagrant-openstack-illuin-provider 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/.rubocop.yml +40 -0
- data/CHANGELOG.md +282 -0
- data/Gemfile +18 -0
- data/RELEASE.md +15 -0
- data/Rakefile +25 -0
- data/Vagrantfile +20 -0
- data/dummy.box +0 -0
- data/example_box/README.md +13 -0
- data/example_box/metadata.json +3 -0
- data/functional_tests/Vagrantfile +58 -0
- data/functional_tests/keys/vagrant-openstack +27 -0
- data/functional_tests/keys/vagrant-openstack.pub +1 -0
- data/functional_tests/run_tests.sh +142 -0
- data/lib/vagrant-openstack-illuin-provider.rb +29 -0
- data/lib/vagrant-openstack-illuin-provider/action.rb +344 -0
- data/lib/vagrant-openstack-illuin-provider/action/abstract_action.rb +22 -0
- data/lib/vagrant-openstack-illuin-provider/action/connect_openstack.rb +60 -0
- data/lib/vagrant-openstack-illuin-provider/action/create_server.rb +187 -0
- data/lib/vagrant-openstack-illuin-provider/action/create_stack.rb +76 -0
- data/lib/vagrant-openstack-illuin-provider/action/delete_server.rb +53 -0
- data/lib/vagrant-openstack-illuin-provider/action/delete_stack.rb +73 -0
- data/lib/vagrant-openstack-illuin-provider/action/message.rb +19 -0
- data/lib/vagrant-openstack-illuin-provider/action/provision.rb +60 -0
- data/lib/vagrant-openstack-illuin-provider/action/read_ssh_info.rb +74 -0
- data/lib/vagrant-openstack-illuin-provider/action/read_state.rb +43 -0
- data/lib/vagrant-openstack-illuin-provider/action/resume.rb +24 -0
- data/lib/vagrant-openstack-illuin-provider/action/snapshot_cleanup.rb +32 -0
- data/lib/vagrant-openstack-illuin-provider/action/snapshot_delete.rb +32 -0
- data/lib/vagrant-openstack-illuin-provider/action/snapshot_list.rb +22 -0
- data/lib/vagrant-openstack-illuin-provider/action/snapshot_restore.rb +29 -0
- data/lib/vagrant-openstack-illuin-provider/action/snapshot_save.rb +51 -0
- data/lib/vagrant-openstack-illuin-provider/action/start_server.rb +24 -0
- data/lib/vagrant-openstack-illuin-provider/action/stop_server.rb +25 -0
- data/lib/vagrant-openstack-illuin-provider/action/suspend.rb +24 -0
- data/lib/vagrant-openstack-illuin-provider/action/sync_folders.rb +138 -0
- data/lib/vagrant-openstack-illuin-provider/action/wait_active.rb +33 -0
- data/lib/vagrant-openstack-illuin-provider/action/wait_stop.rb +33 -0
- data/lib/vagrant-openstack-illuin-provider/cap/snapshot_list.rb +15 -0
- data/lib/vagrant-openstack-illuin-provider/catalog/openstack_catalog.rb +90 -0
- data/lib/vagrant-openstack-illuin-provider/client/cinder.rb +39 -0
- data/lib/vagrant-openstack-illuin-provider/client/domain.rb +163 -0
- data/lib/vagrant-openstack-illuin-provider/client/glance.rb +65 -0
- data/lib/vagrant-openstack-illuin-provider/client/heat.rb +49 -0
- data/lib/vagrant-openstack-illuin-provider/client/http_utils.rb +116 -0
- data/lib/vagrant-openstack-illuin-provider/client/keystone.rb +128 -0
- data/lib/vagrant-openstack-illuin-provider/client/neutron.rb +48 -0
- data/lib/vagrant-openstack-illuin-provider/client/nova.rb +303 -0
- data/lib/vagrant-openstack-illuin-provider/client/openstack.rb +59 -0
- data/lib/vagrant-openstack-illuin-provider/client/request_logger.rb +23 -0
- data/lib/vagrant-openstack-illuin-provider/client/rest_utils.rb +28 -0
- data/lib/vagrant-openstack-illuin-provider/command/abstract_command.rb +51 -0
- data/lib/vagrant-openstack-illuin-provider/command/flavor_list.rb +24 -0
- data/lib/vagrant-openstack-illuin-provider/command/floatingip_list.rb +32 -0
- data/lib/vagrant-openstack-illuin-provider/command/image_list.rb +29 -0
- data/lib/vagrant-openstack-illuin-provider/command/main.rb +52 -0
- data/lib/vagrant-openstack-illuin-provider/command/network_list.rb +25 -0
- data/lib/vagrant-openstack-illuin-provider/command/openstack_command.rb +16 -0
- data/lib/vagrant-openstack-illuin-provider/command/reset.rb +20 -0
- data/lib/vagrant-openstack-illuin-provider/command/subnet_list.rb +22 -0
- data/lib/vagrant-openstack-illuin-provider/command/utils.rb +22 -0
- data/lib/vagrant-openstack-illuin-provider/command/volume_list.rb +25 -0
- data/lib/vagrant-openstack-illuin-provider/config.rb +505 -0
- data/lib/vagrant-openstack-illuin-provider/config/http.rb +39 -0
- data/lib/vagrant-openstack-illuin-provider/config_resolver.rb +334 -0
- data/lib/vagrant-openstack-illuin-provider/errors.rb +187 -0
- data/lib/vagrant-openstack-illuin-provider/logging.rb +39 -0
- data/lib/vagrant-openstack-illuin-provider/plugin.rb +58 -0
- data/lib/vagrant-openstack-illuin-provider/provider.rb +50 -0
- data/lib/vagrant-openstack-illuin-provider/utils.rb +81 -0
- data/lib/vagrant-openstack-illuin-provider/version.rb +15 -0
- data/lib/vagrant-openstack-illuin-provider/version_checker.rb +76 -0
- data/locales/en.yml +412 -0
- data/spec/vagrant-openstack-illuin-provider/action/connect_openstack_spec.rb +770 -0
- data/spec/vagrant-openstack-illuin-provider/action/create_server_spec.rb +260 -0
- data/spec/vagrant-openstack-illuin-provider/action/create_stack_spec.rb +99 -0
- data/spec/vagrant-openstack-illuin-provider/action/delete_server_spec.rb +89 -0
- data/spec/vagrant-openstack-illuin-provider/action/delete_stack_spec.rb +63 -0
- data/spec/vagrant-openstack-illuin-provider/action/message_spec.rb +33 -0
- data/spec/vagrant-openstack-illuin-provider/action/provision_spec.rb +97 -0
- data/spec/vagrant-openstack-illuin-provider/action/read_ssh_info_spec.rb +202 -0
- data/spec/vagrant-openstack-illuin-provider/action/read_state_spec.rb +81 -0
- data/spec/vagrant-openstack-illuin-provider/action/resume_server_spec.rb +49 -0
- data/spec/vagrant-openstack-illuin-provider/action/start_server_spec.rb +49 -0
- data/spec/vagrant-openstack-illuin-provider/action/stop_server_spec.rb +49 -0
- data/spec/vagrant-openstack-illuin-provider/action/suspend_server_spec.rb +49 -0
- data/spec/vagrant-openstack-illuin-provider/action/sync_folders_spec.rb +155 -0
- data/spec/vagrant-openstack-illuin-provider/action/wait_active_spec.rb +53 -0
- data/spec/vagrant-openstack-illuin-provider/action/wait_stop_spec.rb +53 -0
- data/spec/vagrant-openstack-illuin-provider/action_spec.rb +120 -0
- data/spec/vagrant-openstack-illuin-provider/client/cinder_spec.rb +129 -0
- data/spec/vagrant-openstack-illuin-provider/client/glance_spec.rb +145 -0
- data/spec/vagrant-openstack-illuin-provider/client/heat_spec.rb +130 -0
- data/spec/vagrant-openstack-illuin-provider/client/keystone_spec.rb +226 -0
- data/spec/vagrant-openstack-illuin-provider/client/neutron_spec.rb +173 -0
- data/spec/vagrant-openstack-illuin-provider/client/nova_spec.rb +760 -0
- data/spec/vagrant-openstack-illuin-provider/client/utils_spec.rb +176 -0
- data/spec/vagrant-openstack-illuin-provider/command/flavor_list_spec.rb +43 -0
- data/spec/vagrant-openstack-illuin-provider/command/floatingip_list_spec.rb +74 -0
- data/spec/vagrant-openstack-illuin-provider/command/image_list_spec.rb +95 -0
- data/spec/vagrant-openstack-illuin-provider/command/network_list_spec.rb +65 -0
- data/spec/vagrant-openstack-illuin-provider/command/reset_spec.rb +24 -0
- data/spec/vagrant-openstack-illuin-provider/command/subnet_list_spec.rb +45 -0
- data/spec/vagrant-openstack-illuin-provider/command/volume_list_spec.rb +40 -0
- data/spec/vagrant-openstack-illuin-provider/config_resolver_spec.rb +879 -0
- data/spec/vagrant-openstack-illuin-provider/config_spec.rb +416 -0
- data/spec/vagrant-openstack-illuin-provider/e2e_spec.rb.save +27 -0
- data/spec/vagrant-openstack-illuin-provider/provider_spec.rb +13 -0
- data/spec/vagrant-openstack-illuin-provider/spec_helper.rb +37 -0
- data/spec/vagrant-openstack-illuin-provider/utils_spec.rb +197 -0
- data/spec/vagrant-openstack-illuin-provider/version_checker_spec.rb +39 -0
- data/stackrc +25 -0
- data/vagrant-openstack-illuin-provider.gemspec +35 -0
- metadata +379 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'vagrant-openstack-illuin-provider/action/abstract_action'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Openstack
|
5
|
+
module Action
|
6
|
+
class Suspend < AbstractAction
|
7
|
+
def initialize(app, _env)
|
8
|
+
@app = app
|
9
|
+
@logger = Log4r::Logger.new('vagrant_openstack::action::suspend_server')
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(env)
|
13
|
+
if env[:machine].id
|
14
|
+
@logger.info "Saving VM #{env[:machine].id} state and suspending execution..."
|
15
|
+
env[:ui].info I18n.t('vagrant.actions.vm.suspend.suspending')
|
16
|
+
env[:openstack_client].nova.suspend_server(env, env[:machine].id)
|
17
|
+
end
|
18
|
+
|
19
|
+
@app.call(env)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
require 'rbconfig'
|
3
|
+
require 'vagrant/util/subprocess'
|
4
|
+
|
5
|
+
require 'vagrant-openstack-illuin-provider/action/abstract_action'
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module Openstack
|
9
|
+
module Action
|
10
|
+
class SyncFolders < AbstractAction
|
11
|
+
def initialize(app, _env)
|
12
|
+
@app = app
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute(env)
|
16
|
+
sync_method = env[:machine].provider_config.sync_method
|
17
|
+
if sync_method == 'none'
|
18
|
+
NoSyncFolders.new(@app, env).call(env)
|
19
|
+
elsif sync_method == 'rsync'
|
20
|
+
RsyncFolders.new(@app, env).call(env)
|
21
|
+
else
|
22
|
+
fail Errors::SyncMethodError, sync_method_value: sync_method
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class NoSyncFolders
|
28
|
+
def initialize(app, _env)
|
29
|
+
@app = app
|
30
|
+
end
|
31
|
+
|
32
|
+
def call(env)
|
33
|
+
@app.call(env)
|
34
|
+
env[:ui].info(I18n.t('vagrant_openstack.disabled_sync_folders'))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# This middleware uses `rsync` to sync the folders over to the
|
39
|
+
# remote instance.
|
40
|
+
class RsyncFolders
|
41
|
+
def initialize(app, _env)
|
42
|
+
@app = app
|
43
|
+
@logger = Log4r::Logger.new('vagrant_openstack::action::sync_folders')
|
44
|
+
@host_os = RbConfig::CONFIG['host_os']
|
45
|
+
end
|
46
|
+
|
47
|
+
def call(env)
|
48
|
+
@app.call(env)
|
49
|
+
|
50
|
+
if env[:machine].provider_config.ssh_disabled
|
51
|
+
env[:ui].info(I18n.t('vagrant_openstack.ssh_disabled_sync_folders'))
|
52
|
+
return
|
53
|
+
end
|
54
|
+
|
55
|
+
ssh_info = env[:machine].ssh_info
|
56
|
+
|
57
|
+
config = env[:machine].provider_config
|
58
|
+
rsync_includes = config.rsync_includes.to_a
|
59
|
+
|
60
|
+
env[:machine].config.vm.synced_folders.each do |_, data|
|
61
|
+
hostpath = File.expand_path(data[:hostpath], env[:root_path])
|
62
|
+
guestpath = data[:guestpath]
|
63
|
+
|
64
|
+
# Make sure there is a trailing slash on the host path to
|
65
|
+
# avoid creating an additional directory with rsync
|
66
|
+
hostpath = "#{hostpath}/" if hostpath !~ /\/$/
|
67
|
+
|
68
|
+
# If on Windows, modify the path to work with cygwin rsync
|
69
|
+
if @host_os =~ /mswin|mingw|cygwin/
|
70
|
+
hostpath = add_cygdrive_prefix_to_path(hostpath)
|
71
|
+
end
|
72
|
+
|
73
|
+
env[:ui].info(I18n.t('vagrant_openstack.rsync_folder', hostpath: hostpath, guestpath: guestpath))
|
74
|
+
|
75
|
+
# Create the guest path
|
76
|
+
env[:machine].communicate.sudo("mkdir -p '#{guestpath}'")
|
77
|
+
env[:machine].communicate.sudo("chown -R #{ssh_info[:username]} '#{guestpath}'")
|
78
|
+
|
79
|
+
# Generate rsync include commands
|
80
|
+
includes = rsync_includes.each_with_object([]) do |incl, incls|
|
81
|
+
incls << '--include'
|
82
|
+
incls << incl
|
83
|
+
end
|
84
|
+
|
85
|
+
# Create ssh params for rsync
|
86
|
+
# we need them as one string because rsync -e expects one string
|
87
|
+
ssh_params = [
|
88
|
+
"ssh -p #{ssh_info[:port]}",
|
89
|
+
'-o StrictHostKeyChecking=no',
|
90
|
+
'-o UserKnownHostsFile=/dev/null',
|
91
|
+
'-o IdentitiesOnly=yes',
|
92
|
+
"#{ssh_key_options(ssh_info)}"].join(' ')
|
93
|
+
|
94
|
+
# Rsync over to the guest path using the SSH info. add
|
95
|
+
# .hg/ and .git/ to exclude list as that isn't covered in
|
96
|
+
# --cvs-exclude
|
97
|
+
command = [
|
98
|
+
'rsync', '--verbose', '--archive', '-z',
|
99
|
+
'--cvs-exclude',
|
100
|
+
'--exclude', '.hg/',
|
101
|
+
'--exclude', '.git/',
|
102
|
+
'--chmod', 'ugo=rwX',
|
103
|
+
*includes,
|
104
|
+
'-e', ssh_params,
|
105
|
+
hostpath,
|
106
|
+
"#{ssh_info[:username]}@#{ssh_info[:host]}:#{guestpath}"]
|
107
|
+
command.compact!
|
108
|
+
|
109
|
+
# during rsync, ignore files specified in list of files containing exclude patterns
|
110
|
+
# ex: rsync_ignore_files = ['.hgignore', '.gitignore']
|
111
|
+
ignore_files = []
|
112
|
+
ignore_files = env[:machine].provider_config.rsync_ignore_files unless env[:machine].provider_config.rsync_ignore_files.nil?
|
113
|
+
ignore_files.each do |ignore_file|
|
114
|
+
abs_ignore_file = env[:root_path].to_s + '/' + ignore_file
|
115
|
+
command += ['--exclude-from', abs_ignore_file] if File.exist?(abs_ignore_file)
|
116
|
+
end
|
117
|
+
r = Vagrant::Util::Subprocess.execute(*command)
|
118
|
+
next if r.exit_code == 0
|
119
|
+
fail Errors::RsyncError, guestpath: guestpath, hostpath: hostpath, stderr: r.stderr
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
def ssh_key_options(ssh_info)
|
126
|
+
# Ensure that `private_key_path` is an Array (for Vagrant < 1.4)
|
127
|
+
Array(ssh_info[:private_key_path]).map { |path| "-i '#{path}' " }.join
|
128
|
+
end
|
129
|
+
|
130
|
+
def add_cygdrive_prefix_to_path(hostpath)
|
131
|
+
hostpath.downcase.sub(/^([a-z]):\//) do
|
132
|
+
"/cygdrive/#{Regexp.last_match[1]}/"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
require 'timeout'
|
3
|
+
|
4
|
+
require 'vagrant-openstack-illuin-provider/action/abstract_action'
|
5
|
+
|
6
|
+
module VagrantPlugins
|
7
|
+
module Openstack
|
8
|
+
module Action
|
9
|
+
class WaitForServerToBeActive < AbstractAction
|
10
|
+
def initialize(app, _env, retry_interval = 3)
|
11
|
+
@app = app
|
12
|
+
@logger = Log4r::Logger.new('vagrant_openstack::action::start_server')
|
13
|
+
@retry_interval = retry_interval
|
14
|
+
end
|
15
|
+
|
16
|
+
def execute(env)
|
17
|
+
if env[:machine].id
|
18
|
+
env[:ui].info(I18n.t('vagrant_openstack.waiting_start'))
|
19
|
+
client = env[:openstack_client].nova
|
20
|
+
config = env[:machine].provider_config
|
21
|
+
Timeout.timeout(config.server_active_timeout, Errors::Timeout) do
|
22
|
+
while client.get_server_details(env, env[:machine].id)['status'] != 'ACTIVE'
|
23
|
+
sleep @retry_interval
|
24
|
+
@logger.info('Waiting for server to be active')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
@app.call(env)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
require 'timeout'
|
3
|
+
|
4
|
+
require 'vagrant-openstack-illuin-provider/action/abstract_action'
|
5
|
+
|
6
|
+
module VagrantPlugins
|
7
|
+
module Openstack
|
8
|
+
module Action
|
9
|
+
class WaitForServerToStop < AbstractAction
|
10
|
+
def initialize(app, _env, retry_interval = 3)
|
11
|
+
@app = app
|
12
|
+
@logger = Log4r::Logger.new('vagrant_openstack::action::stop_server')
|
13
|
+
@retry_interval = retry_interval
|
14
|
+
end
|
15
|
+
|
16
|
+
def execute(env)
|
17
|
+
if env[:machine].id
|
18
|
+
env[:ui].info(I18n.t('vagrant_openstack.waiting_stop'))
|
19
|
+
client = env[:openstack_client].nova
|
20
|
+
config = env[:machine].provider_config
|
21
|
+
Timeout.timeout(config.server_stop_timeout, Errors::Timeout) do
|
22
|
+
while client.get_server_details(env, env[:machine].id)['status'] != 'SHUTOFF'
|
23
|
+
sleep @retry_interval
|
24
|
+
@logger.info('Waiting for server to stop')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
@app.call(env)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Openstack
|
3
|
+
module Cap
|
4
|
+
module SnapshotList
|
5
|
+
# Returns a list of the snapshots that are taken on this machine.
|
6
|
+
#
|
7
|
+
# @return [Array<String>]
|
8
|
+
def self.snapshot_list(machine)
|
9
|
+
env = machine.action(:snapshot_list, lock: false)
|
10
|
+
env[:machine_snapshot_list]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Openstack
|
3
|
+
module Catalog
|
4
|
+
class OpenstackCatalog
|
5
|
+
def initialize
|
6
|
+
@logger = Log4r::Logger.new('vagrant_openstack::action::openstack_reader')
|
7
|
+
end
|
8
|
+
|
9
|
+
def read(env, catalog)
|
10
|
+
config = env[:machine].provider_config
|
11
|
+
client = env[:openstack_client]
|
12
|
+
endpoints = client.session.endpoints
|
13
|
+
@logger.info(I18n.t('vagrant_openstack.client.looking_for_available_endpoints'))
|
14
|
+
@logger.info("Selecting endpoints matching region '#{config.region}'") unless config.region.nil?
|
15
|
+
|
16
|
+
catalog.each do |service|
|
17
|
+
se = service['endpoints']
|
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)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
endpoints[:network] = choose_api_version('Neutron', 'openstack_network_url', 'v2') do
|
26
|
+
client.neutron.get_api_version_list(env, :network)
|
27
|
+
end if config.openstack_network_url.nil? && !endpoints[:network].nil?
|
28
|
+
|
29
|
+
endpoints[:image] = choose_api_version('Glance', 'openstack_image_url', nil, false) do
|
30
|
+
client.glance.get_api_version_list(env)
|
31
|
+
end if config.openstack_image_url.nil? && !endpoints[:image].nil?
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
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
|
+
|
67
|
+
def choose_api_version(service_name, url_property, version_prefix = nil, fail_if_not_found = true)
|
68
|
+
versions = yield
|
69
|
+
|
70
|
+
return versions.first['links'].first['href'] if version_prefix.nil?
|
71
|
+
|
72
|
+
if versions.size == 1
|
73
|
+
return versions.first['links'].first['href'] if versions.first['id'].start_with?(version_prefix)
|
74
|
+
fail Errors::NoMatchingApiVersion, api_name: service_name, url_property: url_property, version_list: version_list if fail_if_not_found
|
75
|
+
end
|
76
|
+
|
77
|
+
version_list = ''
|
78
|
+
versions.each do |version|
|
79
|
+
return version['links'].first['href'] if version['id'].start_with?(version_prefix)
|
80
|
+
links = version['links'].map { |l| l['href'] }
|
81
|
+
version_list << "#{version['id'].ljust(6)} #{version['status'].ljust(10)} #{links}\n"
|
82
|
+
end
|
83
|
+
|
84
|
+
fail Errors::NoMatchingApiVersion, api_name: service_name, url_property: url_property, version_list: version_list if fail_if_not_found
|
85
|
+
nil
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
require 'vagrant-openstack-illuin-provider/client/http_utils'
|
5
|
+
require 'vagrant-openstack-illuin-provider/client/domain'
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module Openstack
|
9
|
+
class CinderClient
|
10
|
+
include Singleton
|
11
|
+
include VagrantPlugins::Openstack::HttpUtils
|
12
|
+
include VagrantPlugins::Openstack::Domain
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@logger = Log4r::Logger.new('vagrant_openstack::cinder')
|
16
|
+
@session = VagrantPlugins::Openstack.session
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_all_volumes(env)
|
20
|
+
volumes_json = get(env, "#{@session.endpoints[:volume]}/volumes/detail")
|
21
|
+
JSON.parse(volumes_json)['volumes'].map do |volume|
|
22
|
+
name = volume['display_name']
|
23
|
+
name = volume['name'] if name.nil? # To be compatible with cinder api v1 and v2
|
24
|
+
case volume['attachments'].size
|
25
|
+
when 0
|
26
|
+
@logger.debug "No attachment found for volume #{volume['id']}"
|
27
|
+
else
|
28
|
+
attachment = volume['attachments'][0]
|
29
|
+
server_id = attachment['server_id']
|
30
|
+
device = attachment['device']
|
31
|
+
@logger.warn "Found #{attachment.size} attachments for volume #{volume['id']} : " if attachment.size > 1
|
32
|
+
@logger.debug "Attachment found for volume #{volume['id']} : #{attachment.to_json}"
|
33
|
+
end
|
34
|
+
Volume.new(volume['id'], name, volume['size'], volume['status'], volume['bootable'], server_id, device)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Openstack
|
6
|
+
module Domain
|
7
|
+
class Item
|
8
|
+
attr_accessor :id, :name
|
9
|
+
def initialize(id, name)
|
10
|
+
@id = id
|
11
|
+
@name = name
|
12
|
+
end
|
13
|
+
|
14
|
+
def ==(other)
|
15
|
+
other.class == self.class && other.state == state
|
16
|
+
end
|
17
|
+
|
18
|
+
def state
|
19
|
+
[@id, @name]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class Image < Item
|
24
|
+
attr_accessor :visibility
|
25
|
+
attr_accessor :size
|
26
|
+
attr_accessor :min_ram
|
27
|
+
attr_accessor :min_disk
|
28
|
+
attr_accessor :metadata
|
29
|
+
|
30
|
+
# rubocop:disable Metrics/ParameterLists
|
31
|
+
def initialize(id, name, visibility = nil, size = nil, min_ram = nil, min_disk = nil, metadata = {})
|
32
|
+
@visibility = visibility
|
33
|
+
@size = size
|
34
|
+
@min_ram = min_ram
|
35
|
+
@min_disk = min_disk
|
36
|
+
@metadata = metadata
|
37
|
+
super(id, name)
|
38
|
+
end
|
39
|
+
# rubocop:enable Metrics/ParameterLists
|
40
|
+
|
41
|
+
protected
|
42
|
+
|
43
|
+
def state
|
44
|
+
[@id, @name, @visibility, @size, @min_ram, @min_disk, @metadata]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class Flavor < Item
|
49
|
+
#
|
50
|
+
# The number of vCPU
|
51
|
+
#
|
52
|
+
attr_accessor :vcpus
|
53
|
+
|
54
|
+
#
|
55
|
+
# The amount of RAM in Megaoctet
|
56
|
+
#
|
57
|
+
attr_accessor :ram
|
58
|
+
|
59
|
+
#
|
60
|
+
# The size of root disk in Gigaoctet
|
61
|
+
#
|
62
|
+
attr_accessor :disk
|
63
|
+
|
64
|
+
def initialize(id, name, vcpus, ram, disk)
|
65
|
+
@vcpus = vcpus
|
66
|
+
@ram = ram
|
67
|
+
@disk = disk
|
68
|
+
super(id, name)
|
69
|
+
end
|
70
|
+
|
71
|
+
protected
|
72
|
+
|
73
|
+
def state
|
74
|
+
[@id, @name, @vcpus, @ram, @disk]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class FloatingIP
|
79
|
+
attr_accessor :ip, :pool, :instance_id
|
80
|
+
def initialize(ip, pool, instance_id)
|
81
|
+
@ip = ip
|
82
|
+
@pool = pool
|
83
|
+
@instance_id = instance_id
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class Volume < Item
|
88
|
+
#
|
89
|
+
# Size in Gigaoctet
|
90
|
+
#
|
91
|
+
attr_accessor :size
|
92
|
+
|
93
|
+
#
|
94
|
+
# Status (e.g. 'Available', 'In-use')
|
95
|
+
#
|
96
|
+
attr_accessor :status
|
97
|
+
|
98
|
+
#
|
99
|
+
# Whether volume is bootable or not
|
100
|
+
#
|
101
|
+
attr_accessor :bootable
|
102
|
+
|
103
|
+
#
|
104
|
+
# instance id volume is attached to
|
105
|
+
#
|
106
|
+
attr_accessor :instance_id
|
107
|
+
|
108
|
+
#
|
109
|
+
# device (e.g. /dev/sdb) if attached
|
110
|
+
#
|
111
|
+
attr_accessor :device
|
112
|
+
|
113
|
+
# rubocop:disable Metrics/ParameterLists
|
114
|
+
def initialize(id, name, size, status, bootable, instance_id, device)
|
115
|
+
@size = size
|
116
|
+
@status = status
|
117
|
+
@bootable = bootable
|
118
|
+
@instance_id = instance_id
|
119
|
+
@device = device
|
120
|
+
super(id, name)
|
121
|
+
end
|
122
|
+
# rubocop:enable Metrics/ParameterLists
|
123
|
+
|
124
|
+
def to_s
|
125
|
+
{
|
126
|
+
id: @id,
|
127
|
+
name: @name,
|
128
|
+
size: @size,
|
129
|
+
status: @status,
|
130
|
+
bootable: @bootable,
|
131
|
+
instance_id: @instance_id,
|
132
|
+
device: @device
|
133
|
+
}.to_json
|
134
|
+
end
|
135
|
+
|
136
|
+
protected
|
137
|
+
|
138
|
+
def state
|
139
|
+
[@id, @name, @size, @status, @bootable, @instance_id, @device]
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
class Subnet < Item
|
144
|
+
attr_accessor :cidr
|
145
|
+
attr_accessor :enable_dhcp
|
146
|
+
attr_accessor :network_id
|
147
|
+
|
148
|
+
def initialize(id, name, cidr, enable_dhcp, network_id)
|
149
|
+
@cidr = cidr
|
150
|
+
@enable_dhcp = enable_dhcp
|
151
|
+
@network_id = network_id
|
152
|
+
super(id, name)
|
153
|
+
end
|
154
|
+
|
155
|
+
protected
|
156
|
+
|
157
|
+
def state
|
158
|
+
[@id, @name, @cidr, @enable_dhcp, @network_id]
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|