vagrant-1cloud 1.1.1 → 1.1.2
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
- metadata +3 -46
- data/Gemfile +0 -8
- data/LICENSE +0 -373
- data/README.md +0 -117
- data/Rakefile +0 -21
- data/build.sh +0 -32
- data/lib/vagrant-1cloud.rb +0 -20
- data/lib/vagrant-1cloud/actions.rb +0 -183
- data/lib/vagrant-1cloud/actions/check_state.rb +0 -19
- data/lib/vagrant-1cloud/actions/create.rb +0 -93
- data/lib/vagrant-1cloud/actions/destroy.rb +0 -31
- data/lib/vagrant-1cloud/actions/modify_provision_path.rb +0 -38
- data/lib/vagrant-1cloud/actions/power_off.rb +0 -35
- data/lib/vagrant-1cloud/actions/power_on.rb +0 -45
- data/lib/vagrant-1cloud/actions/private_network.rb +0 -108
- data/lib/vagrant-1cloud/actions/rebuild.rb +0 -78
- data/lib/vagrant-1cloud/actions/reload.rb +0 -42
- data/lib/vagrant-1cloud/actions/setup_key.rb +0 -60
- data/lib/vagrant-1cloud/actions/setup_sudo.rb +0 -43
- data/lib/vagrant-1cloud/actions/setup_user.rb +0 -58
- data/lib/vagrant-1cloud/actions/shut_down.rb +0 -35
- data/lib/vagrant-1cloud/commands/add_network.rb +0 -59
- data/lib/vagrant-1cloud/commands/create_network.rb +0 -135
- data/lib/vagrant-1cloud/commands/rebuild.rb +0 -29
- data/lib/vagrant-1cloud/config.rb +0 -62
- data/lib/vagrant-1cloud/errors.rb +0 -33
- data/lib/vagrant-1cloud/helpers/client.rb +0 -181
- data/lib/vagrant-1cloud/helpers/result.rb +0 -40
- data/lib/vagrant-1cloud/plugin.rb +0 -36
- data/lib/vagrant-1cloud/provider.rb +0 -106
- data/lib/vagrant-1cloud/version.rb +0 -5
- data/locales/en.yml +0 -90
- data/pom.xml +0 -59
- data/test/Vagrantfile +0 -14
- data/test/scripts/provision.sh +0 -3
- data/test/test.sh +0 -11
- data/test/test_id_rsa +0 -27
- data/test/test_id_rsa.pub +0 -1
- data/vagrant-1cloud.gemspec +0 -21
@@ -1,58 +0,0 @@
|
|
1
|
-
module VagrantPlugins
|
2
|
-
module OneCloud
|
3
|
-
module Actions
|
4
|
-
class SetupUser
|
5
|
-
def initialize(app, env)
|
6
|
-
@app = app
|
7
|
-
@machine = env[:machine]
|
8
|
-
@logger = Log4r::Logger.new('vagrant::onecloud::setup_user')
|
9
|
-
end
|
10
|
-
|
11
|
-
def call(env)
|
12
|
-
# check if a username has been specified
|
13
|
-
return @app.call(env) unless @machine.config.ssh.username
|
14
|
-
|
15
|
-
# override ssh username to root temporarily
|
16
|
-
user = @machine.config.ssh.username
|
17
|
-
@machine.config.ssh.username = 'root'
|
18
|
-
|
19
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.creating_user', {
|
20
|
-
:user => user
|
21
|
-
})
|
22
|
-
|
23
|
-
# create user account
|
24
|
-
@machine.communicate.execute(<<-BASH)
|
25
|
-
groupadd "#{user}"
|
26
|
-
useradd -m -d "/home/#{user}" -g "#{user}" -r "#{user}" -s "/bin/bash"
|
27
|
-
chown #{user}:#{user} -R "/home/#{user}"
|
28
|
-
BASH
|
29
|
-
|
30
|
-
# grant user sudo access with no password requirement
|
31
|
-
@machine.communicate.execute(<<-BASH)
|
32
|
-
echo "#{user} ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers
|
33
|
-
BASH
|
34
|
-
|
35
|
-
# create the .ssh directory in the users home
|
36
|
-
@machine.communicate.execute("su #{user} -c 'mkdir -p ~/.ssh'")
|
37
|
-
|
38
|
-
# add the specified key to the authorized keys file
|
39
|
-
path = @machine.config.ssh.private_key_path
|
40
|
-
path = path[0] if path.is_a?(Array)
|
41
|
-
path = File.expand_path(path, @machine.env.root_path)
|
42
|
-
pub_key = OneCloud.public_key(path)
|
43
|
-
@machine.communicate.execute(<<-BASH)
|
44
|
-
touch /home/#{user}/.ssh/authorized_keys
|
45
|
-
echo \"#{pub_key}\" >> /home/#{user}/.ssh/authorized_keys
|
46
|
-
chown #{user}:#{user} -R /home/#{user}/.ssh
|
47
|
-
chmod 600 /home/#{user}/.ssh/authorized_keys
|
48
|
-
BASH
|
49
|
-
|
50
|
-
# reset username
|
51
|
-
@machine.config.ssh.username = user
|
52
|
-
|
53
|
-
@app.call(env)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'vagrant-1cloud/helpers/client'
|
2
|
-
|
3
|
-
module VagrantPlugins
|
4
|
-
module OneCloud
|
5
|
-
module Actions
|
6
|
-
class ShutDown
|
7
|
-
include Helpers::Client
|
8
|
-
|
9
|
-
def initialize(app, env)
|
10
|
-
@app = app
|
11
|
-
@machine = env[:machine]
|
12
|
-
@client = client
|
13
|
-
@logger = Log4r::Logger.new('vagrant::onecloud::shut_down')
|
14
|
-
end
|
15
|
-
|
16
|
-
def call(env)
|
17
|
-
# submit shutdown droplet request
|
18
|
-
result = @client.post("/server/#{@machine.id}/action", {
|
19
|
-
:Type => 'ShutDownGuestOS'
|
20
|
-
})
|
21
|
-
|
22
|
-
# wait for request to complete
|
23
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.shutting_down')
|
24
|
-
@client.wait_for_event(env, @machine.id, result['body']['ID'])
|
25
|
-
|
26
|
-
# refresh droplet state with provider
|
27
|
-
Provider.droplet(@machine, :refresh => true)
|
28
|
-
|
29
|
-
@app.call(env)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'optparse'
|
2
|
-
|
3
|
-
module VagrantPlugins
|
4
|
-
module OneCloud
|
5
|
-
module Commands
|
6
|
-
class AddNetwork < Vagrant.plugin('2', :command)
|
7
|
-
|
8
|
-
# Show description when `vagrant list-commands` is triggered
|
9
|
-
def self.synopsis
|
10
|
-
"plugin: vagrant-1cloud: adds VPS to specific private network"
|
11
|
-
end
|
12
|
-
|
13
|
-
def execute
|
14
|
-
options = {}
|
15
|
-
|
16
|
-
optparse = OptionParser.new do |opts|
|
17
|
-
opts.banner = 'Usage: vagrant add-network [vm-name] [options]'
|
18
|
-
|
19
|
-
opts.on('-n', '--net NETNAME', 'Network name') do |net|
|
20
|
-
options[:Net] = net
|
21
|
-
end
|
22
|
-
|
23
|
-
options[:IP] = nil
|
24
|
-
opts.on('-i', '--ip [IP]', 'Private IP address') do |ip|
|
25
|
-
options[:IP] = ip
|
26
|
-
end
|
27
|
-
|
28
|
-
opts.on('-h', '--help', 'Display this screen') do
|
29
|
-
puts opts
|
30
|
-
exit
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
begin
|
35
|
-
optparse.parse!
|
36
|
-
mandatory = [:Net]
|
37
|
-
missing = mandatory.select{ |param| options[param].nil? }
|
38
|
-
unless missing.empty?
|
39
|
-
raise OptionParser::MissingArgument.new(missing.join(', '))
|
40
|
-
end
|
41
|
-
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
|
42
|
-
puts $!.to_s
|
43
|
-
puts optparse
|
44
|
-
exit
|
45
|
-
end
|
46
|
-
|
47
|
-
argv = parse_options(optparse)
|
48
|
-
|
49
|
-
with_target_vms(argv) do |machine|
|
50
|
-
machine.provider_config.private_net = {options[:Net] => options[:IP]}
|
51
|
-
machine.action(:addnet)
|
52
|
-
end
|
53
|
-
|
54
|
-
0
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,135 +0,0 @@
|
|
1
|
-
require 'optparse'
|
2
|
-
require 'vagrant-1cloud/helpers/result'
|
3
|
-
require 'faraday'
|
4
|
-
require 'json'
|
5
|
-
|
6
|
-
module VagrantPlugins
|
7
|
-
module OneCloud
|
8
|
-
module Commands
|
9
|
-
class CreateNetwork < Vagrant.plugin('2', :command)
|
10
|
-
include Helpers
|
11
|
-
include Vagrant::Util::Retryable
|
12
|
-
|
13
|
-
# Show description when `vagrant list-commands` is triggered
|
14
|
-
def self.synopsis
|
15
|
-
"plugin: vagrant-1cloud: creates new private network"
|
16
|
-
end
|
17
|
-
|
18
|
-
def execute
|
19
|
-
options = {}
|
20
|
-
|
21
|
-
optparse = OptionParser.new do |opts|
|
22
|
-
opts.banner = 'Usage: vagrant create-network [options]'
|
23
|
-
|
24
|
-
opts.on('-n', '--name NAME', 'Network name') do |name|
|
25
|
-
options[:Name] = name
|
26
|
-
end
|
27
|
-
|
28
|
-
options[:IsDHCP] = false
|
29
|
-
opts.on('-d', '--[no-]dhcp', "Use dhcp or not (default #{options[:IsDHCP]})") do |dhcp|
|
30
|
-
options[:IsDHCP] = dhcp
|
31
|
-
end
|
32
|
-
|
33
|
-
opts.on('-l', '--location LOCATION', 'Network location') do |location|
|
34
|
-
options[:DCLocation] = location
|
35
|
-
end
|
36
|
-
|
37
|
-
opts.on('-t', '--token TOKEN', '1cloud type token') do |token|
|
38
|
-
options[:token] = token
|
39
|
-
end
|
40
|
-
|
41
|
-
opts.on('-h', '--help', 'Display this screen') do
|
42
|
-
puts opts
|
43
|
-
exit
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
begin
|
48
|
-
optparse.parse!
|
49
|
-
mandatory = [:Name, :DCLocation, :token]
|
50
|
-
missing = mandatory.select{ |param| options[param].nil? }
|
51
|
-
unless missing.empty?
|
52
|
-
raise OptionParser::MissingArgument.new(missing.join(', '))
|
53
|
-
end
|
54
|
-
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
|
55
|
-
puts $!.to_s
|
56
|
-
puts optparse
|
57
|
-
exit
|
58
|
-
end
|
59
|
-
|
60
|
-
result = request(options[:token], '/network')
|
61
|
-
private_network = result['body'].find { |network| network['Name'] == options[:Name] }
|
62
|
-
|
63
|
-
if private_network
|
64
|
-
@env.ui.info I18n.t('vagrant_1cloud.info.network_exists', network: options[:Name])
|
65
|
-
else
|
66
|
-
@env.ui.info I18n.t('vagrant_1cloud.info.network_missing', network: options[:Name])
|
67
|
-
|
68
|
-
result = request(options[:token], '/network', options.except(:token), :post)
|
69
|
-
|
70
|
-
# Waiting for private network to create
|
71
|
-
@env.ui.info I18n.t('vagrant_1cloud.info.creating_private_network')
|
72
|
-
wait_for_network(options[:token], result['body']['ID'])
|
73
|
-
end
|
74
|
-
|
75
|
-
0
|
76
|
-
end
|
77
|
-
|
78
|
-
def request(token, path, params = {}, method = :get)
|
79
|
-
connection = Faraday.new({
|
80
|
-
:url => 'https://api.1cloud.ru/'
|
81
|
-
})
|
82
|
-
|
83
|
-
begin
|
84
|
-
@env.ui.info I18n.t('vagrant_1cloud.info.request', path: path)
|
85
|
-
@env.ui.info I18n.t('vagrant_1cloud.info.params', params: params)
|
86
|
-
result = connection.send(method) do |req|
|
87
|
-
req.url path
|
88
|
-
req.headers['Authorization'] = "Bearer #{token}"
|
89
|
-
req.body = params
|
90
|
-
end
|
91
|
-
rescue Faraday::Error::ConnectionFailed => e
|
92
|
-
# TODO this is suspect but because faraday wraps the exception
|
93
|
-
# in something generic there doesn't appear to be another
|
94
|
-
# way to distinguish different connection errors :(
|
95
|
-
if e.message =~ /certificate verify failed/
|
96
|
-
raise Errors::CertificateError
|
97
|
-
end
|
98
|
-
raise e
|
99
|
-
end
|
100
|
-
|
101
|
-
begin
|
102
|
-
body = JSON.parse(%Q[{"body":#{result.body}}])
|
103
|
-
@env.ui.info I18n.t('vagrant_1cloud.info.response', body: body)
|
104
|
-
rescue JSON::ParserError => e
|
105
|
-
raise(Errors::JSONError, {
|
106
|
-
:message => e.message,
|
107
|
-
:path => path,
|
108
|
-
:params => params,
|
109
|
-
:response => result.body
|
110
|
-
})
|
111
|
-
end
|
112
|
-
|
113
|
-
unless /^2\d\d$/ =~ result.status.to_s
|
114
|
-
raise(Errors::APIStatusError, {
|
115
|
-
:path => path,
|
116
|
-
:params => params,
|
117
|
-
:status => result.status,
|
118
|
-
:response => body.inspect
|
119
|
-
})
|
120
|
-
end
|
121
|
-
|
122
|
-
Result.new(body)
|
123
|
-
end
|
124
|
-
|
125
|
-
def wait_for_network(token, net_id)
|
126
|
-
retryable(:tries => 400, :sleep => 10) do
|
127
|
-
# check network status
|
128
|
-
result = request(token, "/network/#{net_id}")
|
129
|
-
raise 'Network is not active' if result['body']['State'] != 'Active'
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'optparse'
|
2
|
-
|
3
|
-
module VagrantPlugins
|
4
|
-
module OneCloud
|
5
|
-
module Commands
|
6
|
-
class Rebuild < Vagrant.plugin('2', :command)
|
7
|
-
|
8
|
-
# Show description when `vagrant list-commands` is triggered
|
9
|
-
def self.synopsis
|
10
|
-
"plugin: vagrant-1cloud: destroys and ups the vm with the same ip address"
|
11
|
-
end
|
12
|
-
|
13
|
-
def execute
|
14
|
-
opts = OptionParser.new do |o|
|
15
|
-
o.banner = 'Usage: vagrant rebuild [vm-name]'
|
16
|
-
end
|
17
|
-
|
18
|
-
argv = parse_options(opts)
|
19
|
-
|
20
|
-
with_target_vms(argv) do |machine|
|
21
|
-
machine.action(:rebuild)
|
22
|
-
end
|
23
|
-
|
24
|
-
0
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
module VagrantPlugins
|
2
|
-
module OneCloud
|
3
|
-
class Config < Vagrant.plugin('2', :config)
|
4
|
-
attr_accessor :token
|
5
|
-
attr_accessor :image
|
6
|
-
attr_accessor :region
|
7
|
-
attr_accessor :hdd
|
8
|
-
attr_accessor :hdd_type
|
9
|
-
attr_accessor :cpu
|
10
|
-
attr_accessor :ram
|
11
|
-
attr_accessor :hi_perf
|
12
|
-
attr_accessor :ca_path
|
13
|
-
attr_accessor :private_net
|
14
|
-
attr_accessor :ssh_key_name
|
15
|
-
|
16
|
-
def initialize
|
17
|
-
@token = UNSET_VALUE
|
18
|
-
@image = UNSET_VALUE
|
19
|
-
@region = UNSET_VALUE
|
20
|
-
@hdd = UNSET_VALUE
|
21
|
-
@hdd_type = UNSET_VALUE
|
22
|
-
@cpu = UNSET_VALUE
|
23
|
-
@ram = UNSET_VALUE
|
24
|
-
@hi_perf = UNSET_VALUE
|
25
|
-
@ca_path = UNSET_VALUE
|
26
|
-
@private_net = UNSET_VALUE
|
27
|
-
@ssh_key_name = UNSET_VALUE
|
28
|
-
end
|
29
|
-
|
30
|
-
def finalize!
|
31
|
-
@token = ENV['DO_TOKEN'] if @token == UNSET_VALUE
|
32
|
-
@image = '7' if @image == UNSET_VALUE
|
33
|
-
@region = 'SdnSpb' if @region == UNSET_VALUE
|
34
|
-
@hdd = '10' if @hdd == UNSET_VALUE
|
35
|
-
@hdd_type = 'SAS' if @hdd_type == UNSET_VALUE
|
36
|
-
@cpu = '1' if @cpu == UNSET_VALUE
|
37
|
-
@ram = '512' if @ram == UNSET_VALUE
|
38
|
-
@hi_perf = false if @hi_perf == UNSET_VALUE
|
39
|
-
@ca_path = nil if @ca_path == UNSET_VALUE
|
40
|
-
@private_net = nil if @private_net == UNSET_VALUE
|
41
|
-
@ssh_key_name = 'Vagrant' if @ssh_key_name == UNSET_VALUE
|
42
|
-
end
|
43
|
-
|
44
|
-
def validate(machine)
|
45
|
-
errors = []
|
46
|
-
errors << I18n.t('vagrant_1cloud.config.token') if !@token
|
47
|
-
|
48
|
-
key = machine.config.ssh.private_key_path
|
49
|
-
key = key[0] if key.is_a?(Array)
|
50
|
-
if !key
|
51
|
-
errors << I18n.t('vagrant_1cloud.config.private_key')
|
52
|
-
elsif !File.file?(File.expand_path("#{key}.pub", machine.env.root_path))
|
53
|
-
errors << I18n.t('vagrant_1cloud.config.public_key', {
|
54
|
-
:key => "#{key}.pub"
|
55
|
-
})
|
56
|
-
end
|
57
|
-
|
58
|
-
{ '1cloud Provider' => errors }
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module VagrantPlugins
|
2
|
-
module OneCloud
|
3
|
-
module Errors
|
4
|
-
class OneCloudError < Vagrant::Errors::VagrantError
|
5
|
-
error_namespace("vagrant_1cloud.errors")
|
6
|
-
end
|
7
|
-
|
8
|
-
class APIStatusError < OneCloudError
|
9
|
-
error_key(:api_status)
|
10
|
-
end
|
11
|
-
|
12
|
-
class JSONError < OneCloudError
|
13
|
-
error_key(:json)
|
14
|
-
end
|
15
|
-
|
16
|
-
class ResultMatchError < OneCloudError
|
17
|
-
error_key(:result_match)
|
18
|
-
end
|
19
|
-
|
20
|
-
class CertificateError < OneCloudError
|
21
|
-
error_key(:certificate)
|
22
|
-
end
|
23
|
-
|
24
|
-
class PublicKeyError < OneCloudError
|
25
|
-
error_key(:public_key)
|
26
|
-
end
|
27
|
-
|
28
|
-
class RsyncError < OneCloudError
|
29
|
-
error_key(:rsync)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,181 +0,0 @@
|
|
1
|
-
require 'vagrant-1cloud/helpers/result'
|
2
|
-
require 'faraday'
|
3
|
-
require 'json'
|
4
|
-
|
5
|
-
module VagrantPlugins
|
6
|
-
module OneCloud
|
7
|
-
module Helpers
|
8
|
-
module Client
|
9
|
-
def client
|
10
|
-
@client ||= ApiClient.new(@machine)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
class ApiClient
|
15
|
-
include Vagrant::Util::Retryable
|
16
|
-
|
17
|
-
def initialize(machine)
|
18
|
-
@logger = Log4r::Logger.new('vagrant::onecloud::apiclient')
|
19
|
-
@config = machine.provider_config
|
20
|
-
@machine = machine
|
21
|
-
@client = Faraday.new({
|
22
|
-
:url => 'https://api.1cloud.ru/',
|
23
|
-
:ssl => {
|
24
|
-
:ca_file => @config.ca_path
|
25
|
-
}
|
26
|
-
})
|
27
|
-
end
|
28
|
-
|
29
|
-
def delete(path, params = {})
|
30
|
-
@client.request :url_encoded
|
31
|
-
request(path, params, :delete)
|
32
|
-
end
|
33
|
-
|
34
|
-
def post(path, params = {})
|
35
|
-
@client.headers['Content-Type'] = 'application/json'
|
36
|
-
request(path, params, :post)
|
37
|
-
end
|
38
|
-
|
39
|
-
def request(path, params = {}, method = :get)
|
40
|
-
begin
|
41
|
-
@logger.info "Request: #{path}"
|
42
|
-
@logger.info "Parameters: #{params}"
|
43
|
-
result = @client.send(method) do |req|
|
44
|
-
req.url path
|
45
|
-
req.headers['Authorization'] = "Bearer #{@config.token}"
|
46
|
-
req.body = params.to_json
|
47
|
-
end
|
48
|
-
rescue Faraday::Error::ConnectionFailed => e
|
49
|
-
# TODO this is suspect but because faraday wraps the exception
|
50
|
-
# in something generic there doesn't appear to be another
|
51
|
-
# way to distinguish different connection errors :(
|
52
|
-
if e.message =~ /certificate verify failed/
|
53
|
-
raise Errors::CertificateError
|
54
|
-
end
|
55
|
-
raise e
|
56
|
-
end
|
57
|
-
|
58
|
-
unless method == :delete
|
59
|
-
begin
|
60
|
-
body = JSON.parse(%Q[{"body":#{result.body}}])
|
61
|
-
@logger.info "Response: #{body}"
|
62
|
-
rescue JSON::ParserError => e
|
63
|
-
raise(Errors::JSONError, {
|
64
|
-
:message => e.message,
|
65
|
-
:path => path,
|
66
|
-
:params => params,
|
67
|
-
:response => result.body
|
68
|
-
})
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
unless /^2\d\d$/ =~ result.status.to_s
|
73
|
-
raise(Errors::APIStatusError, {
|
74
|
-
:path => path,
|
75
|
-
:params => params,
|
76
|
-
:status => result.status,
|
77
|
-
:response => body.inspect
|
78
|
-
})
|
79
|
-
end
|
80
|
-
|
81
|
-
Result.new(body)
|
82
|
-
end
|
83
|
-
|
84
|
-
def wait_for_event(env, m_id, id)
|
85
|
-
retryable(:tries => 400, :sleep => 10) do
|
86
|
-
# stop waiting if interrupted
|
87
|
-
next if env[:interrupted]
|
88
|
-
|
89
|
-
# check action status
|
90
|
-
result = self.request("/server/#{m_id}/action/#{id}")
|
91
|
-
|
92
|
-
yield result if block_given?
|
93
|
-
raise 'Action is not completed' if result['body']['State'] != 'Completed'
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def wait_for_destroy(env, id)
|
98
|
-
retryable(:tries => 400, :sleep => 10) do
|
99
|
-
# stop waiting if interrupted
|
100
|
-
next if env[:interrupted]
|
101
|
-
|
102
|
-
# check action status
|
103
|
-
begin
|
104
|
-
result = @client.send(:get) do |req|
|
105
|
-
req.url "/server/#{id}"
|
106
|
-
req.headers['Authorization'] = "Bearer #{@config.token}"
|
107
|
-
end
|
108
|
-
rescue Faraday::Error::ConnectionFailed => e
|
109
|
-
# TODO this is suspect but because faraday wraps the exception
|
110
|
-
# in something generic there doesn't appear to be another
|
111
|
-
# way to distinguish different connection errors :(
|
112
|
-
if e.message =~ /certificate verify failed/
|
113
|
-
raise Errors::CertificateError
|
114
|
-
end
|
115
|
-
raise e
|
116
|
-
end
|
117
|
-
begin
|
118
|
-
body = JSON.parse(%Q[{"body":#{result.body}}])
|
119
|
-
@logger.info "Response: #{body}"
|
120
|
-
rescue JSON::ParserError => e
|
121
|
-
raise(Errors::JSONError, {
|
122
|
-
:message => e.message,
|
123
|
-
:path => path,
|
124
|
-
:params => params,
|
125
|
-
:response => result.body
|
126
|
-
})
|
127
|
-
end
|
128
|
-
result = Result.new(body)
|
129
|
-
yield result if block_given?
|
130
|
-
raise 'Destroy is not completed' if result['body']['Message'] != 'Server not found'
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
def wait_for_network(env, net_id)
|
135
|
-
retryable(:tries => 400, :sleep => 10) do
|
136
|
-
# stop waiting if interrupted
|
137
|
-
next if env[:interrupted]
|
138
|
-
|
139
|
-
# check network status
|
140
|
-
result = self.request("/network/#{net_id}")
|
141
|
-
|
142
|
-
yield result if block_given?
|
143
|
-
raise 'Network is not active' if result['body']['State'] != 'Active'
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
def wait_for_ssh(env, reboot_num, check_num)
|
148
|
-
i = 0
|
149
|
-
while i <= reboot_num do
|
150
|
-
j = 0
|
151
|
-
while !@machine.communicate.ready? && j < check_num do
|
152
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.ssh_off')
|
153
|
-
sleep 10
|
154
|
-
j += 1
|
155
|
-
end
|
156
|
-
|
157
|
-
if j < check_num
|
158
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.ssh_on')
|
159
|
-
break
|
160
|
-
else
|
161
|
-
if i < reboot_num
|
162
|
-
# submit reboot droplet request
|
163
|
-
result = @client.post("/server/#{@machine.id}/action", {
|
164
|
-
:Type => 'PowerReboot'
|
165
|
-
})
|
166
|
-
|
167
|
-
# wait for request to complete
|
168
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.reloading')
|
169
|
-
@client.wait_for_event(env, @machine.id, result['body']['ID'])
|
170
|
-
|
171
|
-
i += 1
|
172
|
-
else
|
173
|
-
raise 'No ssh connection'
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|