vagrant-1cloud 1.0.7 → 1.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/README.md +115 -0
- data/lib/vagrant-1cloud/actions.rb +39 -0
- data/lib/vagrant-1cloud/actions/create.rb +16 -45
- data/lib/vagrant-1cloud/actions/power_on.rb +2 -31
- data/lib/vagrant-1cloud/actions/private_network.rb +22 -46
- data/lib/vagrant-1cloud/actions/rebuild.rb +78 -0
- data/lib/vagrant-1cloud/actions/reload.rb +2 -31
- data/lib/vagrant-1cloud/actions/setup_key.rb +60 -0
- data/lib/vagrant-1cloud/actions/setup_sudo.rb +43 -0
- data/lib/vagrant-1cloud/actions/setup_user.rb +1 -1
- data/lib/vagrant-1cloud/commands/create_network.rb +135 -0
- data/lib/vagrant-1cloud/commands/rebuild.rb +29 -0
- data/lib/vagrant-1cloud/config.rb +4 -1
- data/lib/vagrant-1cloud/helpers/client.rb +36 -2
- data/lib/vagrant-1cloud/plugin.rb +11 -1
- data/lib/vagrant-1cloud/version.rb +1 -1
- data/locales/en.yml +21 -10
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6b158d2a5ebd6ba2844225d9b1b8a5f01e30a36
|
4
|
+
data.tar.gz: 579da12b738510cdb4ec94000480543108f5c130
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb6b3ab49082434521372f91dbc3aaecffbee9840537cd095b10712d748d9ab042e89e5ddc6418d3d0b94b766e27df6288dd52339e99250a56538f5953b115db
|
7
|
+
data.tar.gz: 5ebf0e8bafad0d97d9e741cb51f7171be1337c6facaacb75e46afc148e488f1e91c516fa707d8450736ffc3232e6c098cbd8090dc8a4325c9e7600bda6b1ab36
|
data/.gitignore
CHANGED
data/README.md
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
1cloud Vagrant Provider
|
2
|
+
==============================
|
3
|
+
|
4
|
+
[![Gem](https://img.shields.io/gem/v/vagrant-1cloud.svg)](https://rubygems.org/gems/vagrant-1cloud)
|
5
|
+
|
6
|
+
`vagrant-1cloud` is a Vagrant provider plugin that supports the management of [1cloud](https://1cloud.ru) VPS.
|
7
|
+
|
8
|
+
Features include:
|
9
|
+
- Create and destroy VPS
|
10
|
+
- Power on and off VPS
|
11
|
+
- Provision a VPS with shell
|
12
|
+
- Setup a SSH public key for authentication
|
13
|
+
- Create a new user account during VPS creation
|
14
|
+
- Create private network
|
15
|
+
- Rebuild VPS
|
16
|
+
|
17
|
+
|
18
|
+
Install
|
19
|
+
-------
|
20
|
+
Install the provider plugin using the Vagrant command-line interface:
|
21
|
+
|
22
|
+
`vagrant plugin install vagrant-1cloud`
|
23
|
+
|
24
|
+
|
25
|
+
Configure
|
26
|
+
---------
|
27
|
+
Once the provider has been installed, you will need to configure your project to use it. See the following example for a basic multi-machine `Vagrantfile` implementation that manages two 1cloud VPS:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
Vagrant.configure('2') do |config|
|
31
|
+
|
32
|
+
config.vm.define "vps1" do |config|
|
33
|
+
config.vm.provider :onecloud do |provider, override|
|
34
|
+
override.ssh.private_key_path = '~/.ssh/id_rsa'
|
35
|
+
override.vm.box = 'onecloud'
|
36
|
+
provider.token = 'YOUR TOKEN'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
config.vm.define "vps2" do |config|
|
41
|
+
config.vm.provider :onecloud do |provider, override|
|
42
|
+
override.ssh.private_key_path = '~/.ssh/id_rsa'
|
43
|
+
override.vm.box = 'onecloud'
|
44
|
+
provider.token = 'YOUR TOKEN'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
```
|
50
|
+
|
51
|
+
**Configuration Requirements**
|
52
|
+
- You *must* specify the `override.ssh.private_key_path` to enable authentication with the VPS.
|
53
|
+
- You *must* specify your 1cloud Personal Access Token at `provider.token`.
|
54
|
+
|
55
|
+
**Supported Configuration Attributes**
|
56
|
+
The following attributes are available to further configure the provider:
|
57
|
+
- `provider.image`
|
58
|
+
* A string representing the image ID to use when creating a new VPS. It defaults to `7` (ubuntu-14-04-x64).
|
59
|
+
- `provider.region`
|
60
|
+
* A string representing the region to create the new VPS in. It defaults to `SdnSpb`.
|
61
|
+
- `provider.hdd`
|
62
|
+
* A number representing the disk space (in GB) to use when creating a new VPS (e.g. 50). It defaults to 10.
|
63
|
+
- `provider.hdd_type`
|
64
|
+
* A string representing the disk type to use when creating a new VPS (e.g. `SSD`). It defaults to `SAS`.
|
65
|
+
- `provider.cpu`
|
66
|
+
* A number representing the amount of cores to use when creating a new VPS (e.g. 2). It defaults to 1.
|
67
|
+
- `provider.ram`
|
68
|
+
* A number representing the RAM (in MB) to use when creating a new VPS (e.g. 1024). It defaults to 512.
|
69
|
+
- `provider.hi_perf`
|
70
|
+
* A boolean flag indicating whether to use high performance pool or not. It defaults to `false`.
|
71
|
+
- `provider.private_net`
|
72
|
+
* A hash representing the pair that indicates the private network name and IP address of a new VPS (e.g. {"testnet" => "192.168.1.10"} or {"testnet" => nil} to set IP address automatically). VPS isn't added to private network by default.
|
73
|
+
- `config.vm.synced_folder`
|
74
|
+
* Supports both rsync__args and rsync__exclude, see the [Vagrant Docs](http://docs.vagrantup.com/v2/synced-folders/rsync.html) for more information. rsync__args default to `["--verbose", "--archive", "--delete", "-z", "--copy-links"]` and rsync__exclude defaults to `[".vagrant/"]`.
|
75
|
+
|
76
|
+
The provider will create a new user account with the specified SSH key for authorization if `config.ssh.username` is set.
|
77
|
+
|
78
|
+
|
79
|
+
Run
|
80
|
+
---
|
81
|
+
After creating your project's `Vagrantfile` with the required configuration
|
82
|
+
attributes described above, you may create a new VPS with the following
|
83
|
+
command:
|
84
|
+
|
85
|
+
$ vagrant up --provider=onecloud
|
86
|
+
|
87
|
+
This command will create a new VPS, setup your SSH key for authentication,
|
88
|
+
create a new user account, and run the provisioners you have configured.
|
89
|
+
|
90
|
+
**Supported Commands**
|
91
|
+
|
92
|
+
The provider supports the following Vagrant sub-commands:
|
93
|
+
- `vagrant destroy` - Destroys the VPS instance.
|
94
|
+
- `vagrant ssh` - Logs into the VPS instance using the configured user account.
|
95
|
+
- `vagrant halt` - Powers off the VPS instance.
|
96
|
+
- `vagrant provision` - Runs the configured provisioners and rsyncs any specified `config.vm.synced_folder`.
|
97
|
+
- `vagrant reload` - Reboots the VPS instance.
|
98
|
+
- `vagrant status` - Outputs the status (active, off, not created) for the VPS instance.
|
99
|
+
- `vagrant create-network` - Creates private network.
|
100
|
+
- `vagrant rebuild` - Rebuilds the VPS.
|
101
|
+
|
102
|
+
Troubleshooting
|
103
|
+
---------------
|
104
|
+
Before submitting a GitHub issue, please ensure both Vagrant and vagrant-onecloud are fully up-to-date.
|
105
|
+
* For the latest Vagrant version, please visit the [Vagrant](https://www.vagrantup.com/) website
|
106
|
+
* To update Vagrant plugins, run the following command: `vagrant plugin update`
|
107
|
+
|
108
|
+
* `vagrant plugin install vagrant-onecloud`
|
109
|
+
* Installation on OS X may not working due to a SSL certificate problem, and you may need to specify a certificate path explicitly. To do so, run `ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"`. Then, add the following environment variable to your `.bash_profile` script and `source` it: `export SSL_CERT_FILE=/usr/local/etc/openssl/cert.pem`.
|
110
|
+
|
111
|
+
|
112
|
+
FAQ
|
113
|
+
---
|
114
|
+
|
115
|
+
* The Chef provisioner is no longer supported by default. Please use the `vagrant-omnibus` plugin to install Chef on Vagrant-managed machines. This plugin provides control over the specific version of Chef to install.
|
@@ -8,6 +8,9 @@ require 'vagrant-1cloud/actions/reload'
|
|
8
8
|
require 'vagrant-1cloud/actions/setup_user'
|
9
9
|
require 'vagrant-1cloud/actions/modify_provision_path'
|
10
10
|
require 'vagrant-1cloud/actions/private_network'
|
11
|
+
require 'vagrant-1cloud/actions/rebuild'
|
12
|
+
require 'vagrant-1cloud/actions/setup_sudo'
|
13
|
+
require 'vagrant-1cloud/actions/setup_key'
|
11
14
|
|
12
15
|
module VagrantPlugins
|
13
16
|
module OneCloud
|
@@ -49,6 +52,22 @@ module VagrantPlugins
|
|
49
52
|
end
|
50
53
|
end
|
51
54
|
|
55
|
+
def self.ssh_run
|
56
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
57
|
+
builder.use ConfigValidate
|
58
|
+
builder.use Call, CheckState do |env, b|
|
59
|
+
case env[:machine_state]
|
60
|
+
when :Active
|
61
|
+
b.use SSHRun
|
62
|
+
when :off
|
63
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.off')
|
64
|
+
when :not_created
|
65
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.not_created')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
52
71
|
def self.provision
|
53
72
|
return Vagrant::Action::Builder.new.tap do |builder|
|
54
73
|
builder.use ConfigValidate
|
@@ -78,8 +97,10 @@ module VagrantPlugins
|
|
78
97
|
b.use PowerOn
|
79
98
|
b.use provision
|
80
99
|
when :not_created
|
100
|
+
b.use SetupKey
|
81
101
|
b.use Create
|
82
102
|
b.use PrivateNetwork
|
103
|
+
b.use SetupSudo
|
83
104
|
b.use SetupUser
|
84
105
|
b.use provision
|
85
106
|
end
|
@@ -123,6 +144,24 @@ module VagrantPlugins
|
|
123
144
|
end
|
124
145
|
end
|
125
146
|
end
|
147
|
+
|
148
|
+
def self.rebuild
|
149
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
150
|
+
builder.use ConfigValidate
|
151
|
+
builder.use Call, CheckState do |env, b|
|
152
|
+
case env[:machine_state]
|
153
|
+
when :Active, :off
|
154
|
+
b.use Rebuild
|
155
|
+
b.use PrivateNetwork
|
156
|
+
b.use SetupSudo
|
157
|
+
b.use SetupUser
|
158
|
+
b.use provision
|
159
|
+
when :not_created
|
160
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.not_created')
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
126
165
|
end
|
127
166
|
end
|
128
167
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'vagrant-1cloud/helpers/client'
|
2
|
-
require 'net/ssh'
|
3
2
|
|
4
3
|
module VagrantPlugins
|
5
4
|
module OneCloud
|
@@ -15,6 +14,8 @@ module VagrantPlugins
|
|
15
14
|
end
|
16
15
|
|
17
16
|
def call(env)
|
17
|
+
ssh_key_id = [env[:ssh_key_id]]
|
18
|
+
|
18
19
|
# submit new droplet request
|
19
20
|
result = @client.post('/server', {
|
20
21
|
:HDD => @machine.provider_config.hdd,
|
@@ -24,6 +25,7 @@ module VagrantPlugins
|
|
24
25
|
:DCLocation => @machine.provider_config.region,
|
25
26
|
:ImageID => @machine.provider_config.image,
|
26
27
|
:Name => @machine.config.vm.hostname || @machine.name,
|
28
|
+
:SshKeys => ssh_key_id,
|
27
29
|
:isHighPerformance => @machine.provider_config.hi_perf
|
28
30
|
}.delete_if { |k, v| v.nil? })
|
29
31
|
|
@@ -38,60 +40,29 @@ module VagrantPlugins
|
|
38
40
|
# refresh droplet state with provider
|
39
41
|
droplet = Provider.droplet(@machine, :refresh => true)
|
40
42
|
|
41
|
-
# add public key to machine
|
42
|
-
path = @machine.config.ssh.private_key_path
|
43
|
-
path = path[0] if path.is_a?(Array)
|
44
|
-
path = File.expand_path(path, @machine.env.root_path)
|
45
|
-
pub_key = OneCloud.public_key(path)
|
46
|
-
Net::SSH.start(droplet['IP'], droplet['AdminUserName'], :password => droplet['AdminPassword']) do |ssh|
|
47
|
-
ssh.exec!("mkdir -p ~/.ssh")
|
48
|
-
ssh.exec!("touch ~/.ssh/authorized_keys")
|
49
|
-
ssh.exec!("echo \"#{pub_key}\" >> ~/.ssh/authorized_keys")
|
50
|
-
ssh.exec!("chmod 600 ~/.ssh/authorized_keys")
|
51
|
-
end
|
52
|
-
|
53
43
|
user = @machine.config.ssh.username
|
54
44
|
@machine.config.ssh.username = 'root'
|
55
45
|
|
56
46
|
# wait for ssh to be ready
|
57
|
-
|
58
|
-
|
59
|
-
$i = 0
|
60
|
-
while $i <= $reboot_num do
|
61
|
-
$j = 0
|
62
|
-
while !@machine.communicate.ready? && $j < $check_num do
|
63
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.ssh_off')
|
64
|
-
sleep 10
|
65
|
-
$j += 1
|
66
|
-
end
|
67
|
-
|
68
|
-
if $j < $check_num
|
69
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.ssh_on')
|
70
|
-
break
|
71
|
-
else
|
72
|
-
if $i < $reboot_num
|
73
|
-
# submit reboot droplet request
|
74
|
-
result = @client.post("/server/#{@machine.id}/action", {
|
75
|
-
:Type => 'PowerReboot'
|
76
|
-
})
|
77
|
-
|
78
|
-
# wait for request to complete
|
79
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.reloading')
|
80
|
-
@client.wait_for_event(env, @machine.id, result['body']['ID'])
|
81
|
-
|
82
|
-
$i += 1
|
83
|
-
else
|
84
|
-
raise 'No ssh connection'
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
47
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.ssh')
|
48
|
+
@client.wait_for_ssh(env, 3, 30)
|
88
49
|
|
89
|
-
# change host name
|
50
|
+
# change authorized_keys file permissions, host name and set public network rules
|
90
51
|
@machine.communicate.execute(<<-BASH)
|
52
|
+
chmod 600 ~/.ssh/authorized_keys
|
53
|
+
|
91
54
|
sed -i -e "s/127.0.1.1.*/127.0.1.1\t#{@machine.config.vm.hostname}/" /etc/hosts
|
92
55
|
sed -i -e "s/#{droplet['IP']}.*/#{droplet['IP']}\t#{@machine.config.vm.hostname}/" /etc/hosts
|
93
56
|
echo #{@machine.config.vm.hostname} > /etc/hostname
|
94
57
|
hostname #{@machine.config.vm.hostname}
|
58
|
+
|
59
|
+
ifdown -a
|
60
|
+
export INTERFACE=eth0
|
61
|
+
export MATCHADDR=$(ifconfig -a | grep eth0 | awk '{print $NF}')
|
62
|
+
export MATCHID=$(udevadm info /sys/class/net/eth0 | grep P: | awk -F/ '{print $(NF-2)}')
|
63
|
+
/lib/udev/write_net_rules
|
64
|
+
udevadm control --reload-rules && udevadm trigger
|
65
|
+
ifup -a
|
95
66
|
BASH
|
96
67
|
|
97
68
|
@machine.config.ssh.username = user
|
@@ -30,37 +30,8 @@ module VagrantPlugins
|
|
30
30
|
@machine.config.ssh.username = 'root'
|
31
31
|
|
32
32
|
# wait for ssh to be ready
|
33
|
-
|
34
|
-
|
35
|
-
$i = 0
|
36
|
-
while $i <= $reboot_num do
|
37
|
-
$j = 0
|
38
|
-
while !@machine.communicate.ready? && $j < $check_num do
|
39
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.ssh_off')
|
40
|
-
sleep 10
|
41
|
-
$j += 1
|
42
|
-
end
|
43
|
-
|
44
|
-
if $j < $check_num
|
45
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.ssh_on')
|
46
|
-
break
|
47
|
-
else
|
48
|
-
if $i < $reboot_num
|
49
|
-
# submit reboot droplet request
|
50
|
-
result = @client.post("/server/#{@machine.id}/action", {
|
51
|
-
:Type => 'PowerReboot'
|
52
|
-
})
|
53
|
-
|
54
|
-
# wait for request to complete
|
55
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.reloading')
|
56
|
-
@client.wait_for_event(env, @machine.id, result['body']['ID'])
|
57
|
-
|
58
|
-
$i += 1
|
59
|
-
else
|
60
|
-
raise 'No ssh connection'
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
33
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.ssh')
|
34
|
+
@client.wait_for_ssh(env, 3, 30)
|
64
35
|
|
65
36
|
@machine.config.ssh.username = user
|
66
37
|
|
@@ -20,36 +20,11 @@ module VagrantPlugins
|
|
20
20
|
return @app.call(env) unless @machine.provider_config.private_net
|
21
21
|
|
22
22
|
@machine.provider_config.private_net.each do |net, ip|
|
23
|
-
lockfile = "/tmp/" + net.to_s + ".lock"
|
24
|
-
f = File.open(lockfile, "w+")
|
25
|
-
|
26
|
-
retryable(:tries => 400, :sleep => 10) do
|
27
|
-
next if env[:interrupted]
|
28
|
-
raise 'Problem with lockfile' if check_file_locked?(lockfile)
|
29
|
-
end
|
30
|
-
|
31
|
-
f.flock(File::LOCK_EX)
|
32
|
-
|
33
23
|
# Getting private network by name
|
34
24
|
result = @client.request('/network')
|
35
25
|
private_network = result['body'].find { |network| network['Name'] == net.to_s }
|
36
26
|
|
37
|
-
#
|
38
|
-
if !private_network
|
39
|
-
result = @client.post("/network", {
|
40
|
-
:Name => net,
|
41
|
-
:IsDHCP => false,
|
42
|
-
:DCLocation => @machine.provider_config.region
|
43
|
-
})
|
44
|
-
# Waiting for private network to create
|
45
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.creating_private_network')
|
46
|
-
@client.wait_for_network(env, result['body']['ID'])
|
47
|
-
|
48
|
-
result = @client.request("/network/#{result['body']['ID']}")
|
49
|
-
private_network = result['body']
|
50
|
-
end
|
51
|
-
|
52
|
-
f.flock(File::LOCK_UN)
|
27
|
+
raise "Private network #{net} is not created" if !private_network
|
53
28
|
|
54
29
|
# Adding server to specified network
|
55
30
|
result = @client.post("/Server/#{@machine.id}/Action", {
|
@@ -75,20 +50,31 @@ module VagrantPlugins
|
|
75
50
|
user = @machine.config.ssh.username
|
76
51
|
@machine.config.ssh.username = 'root'
|
77
52
|
|
78
|
-
# set private
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
export
|
84
|
-
export
|
53
|
+
# set private network rules
|
54
|
+
if private_network['IsDHCP']
|
55
|
+
@machine.communicate.execute(<<-BASH)
|
56
|
+
ifdown -a
|
57
|
+
|
58
|
+
export INTERFACE=$(ifconfig -a | grep #{linked_network['MAC']} | awk '{print $1}')
|
59
|
+
export MATCHADDR=#{linked_network['MAC']}
|
60
|
+
export MATCHID=$(ifconfig -a | grep #{linked_network['MAC']} | awk 'system("udevadm info /sys/class/net/" $1)' | grep P: | awk -F/ '{print $(NF-2)}')
|
85
61
|
/lib/udev/write_net_rules
|
62
|
+
udevadm control --reload-rules && udevadm trigger
|
63
|
+
|
64
|
+
echo >> /etc/network/interfaces
|
65
|
+
ifconfig -a | grep #{linked_network['MAC']} | awk '{print "auto " $1}' >> /etc/network/interfaces
|
66
|
+
ifconfig -a | grep #{linked_network['MAC']} | awk '{print "iface " $1 " inet dhcp"}' >> /etc/network/interfaces
|
86
67
|
|
68
|
+
ifup -a
|
69
|
+
BASH
|
70
|
+
else
|
71
|
+
@machine.communicate.execute(<<-BASH)
|
72
|
+
ifdown -a
|
73
|
+
|
87
74
|
export INTERFACE=$(ifconfig -a | grep #{linked_network['MAC']} | awk '{print $1}')
|
88
75
|
export MATCHADDR=#{linked_network['MAC']}
|
89
76
|
export MATCHID=$(ifconfig -a | grep #{linked_network['MAC']} | awk 'system("udevadm info /sys/class/net/" $1)' | grep P: | awk -F/ '{print $(NF-2)}')
|
90
77
|
/lib/udev/write_net_rules
|
91
|
-
|
92
78
|
udevadm control --reload-rules && udevadm trigger
|
93
79
|
|
94
80
|
echo >> /etc/network/interfaces
|
@@ -98,7 +84,8 @@ module VagrantPlugins
|
|
98
84
|
echo "netmask #{private_network['Mask']}" >> /etc/network/interfaces
|
99
85
|
|
100
86
|
ifup -a
|
101
|
-
|
87
|
+
BASH
|
88
|
+
end
|
102
89
|
|
103
90
|
# reset username
|
104
91
|
@machine.config.ssh.username = user
|
@@ -106,17 +93,6 @@ module VagrantPlugins
|
|
106
93
|
|
107
94
|
@app.call(env)
|
108
95
|
end
|
109
|
-
|
110
|
-
def check_file_locked?(file)
|
111
|
-
f = File.open(file, File::CREAT)
|
112
|
-
Timeout::timeout(0.001) { f.flock(File::LOCK_EX) }
|
113
|
-
f.flock(File::LOCK_UN)
|
114
|
-
false
|
115
|
-
rescue
|
116
|
-
true
|
117
|
-
ensure
|
118
|
-
f.close
|
119
|
-
end
|
120
96
|
end
|
121
97
|
end
|
122
98
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'vagrant-1cloud/helpers/client'
|
2
|
+
require 'net/ssh'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module OneCloud
|
6
|
+
module Actions
|
7
|
+
class Rebuild
|
8
|
+
include Helpers::Client
|
9
|
+
include Vagrant::Util::Retryable
|
10
|
+
|
11
|
+
def initialize(app, env)
|
12
|
+
@app = app
|
13
|
+
@machine = env[:machine]
|
14
|
+
@client = client
|
15
|
+
@logger = Log4r::Logger.new('vagrant::onecloud::rebuild')
|
16
|
+
end
|
17
|
+
|
18
|
+
def call(env)
|
19
|
+
|
20
|
+
# submit rebuild request
|
21
|
+
result = @client.post("/server/#{@machine.id}/rebuild", {
|
22
|
+
:ImageId => @machine.provider_config.image
|
23
|
+
})
|
24
|
+
|
25
|
+
# assign the machine id for reference in other commands
|
26
|
+
@machine.id = result['body']['ID'].to_s
|
27
|
+
|
28
|
+
# wait for request to complete
|
29
|
+
result = @client.request("/server/#{@machine.id}/action")
|
30
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.rebuilding')
|
31
|
+
@client.wait_for_event(env, @machine.id, result['body'].first['ID'])
|
32
|
+
|
33
|
+
# refresh droplet state with provider
|
34
|
+
droplet = Provider.droplet(@machine, :refresh => true)
|
35
|
+
|
36
|
+
user = @machine.config.ssh.username
|
37
|
+
@machine.config.ssh.username = 'root'
|
38
|
+
|
39
|
+
# add public key to machine
|
40
|
+
ssh_key_name = @machine.provider_config.ssh_key_name
|
41
|
+
result = @client.request('/sshkey')
|
42
|
+
pub_key = result['body'].find { |k| k['Title'] == ssh_key_name }
|
43
|
+
|
44
|
+
Net::SSH.start(droplet['IP'], droplet['AdminUserName'], :password => droplet['AdminPassword']) do |ssh|
|
45
|
+
ssh.exec!("mkdir ~/.ssh")
|
46
|
+
ssh.exec!("touch ~/.ssh/authorized_keys")
|
47
|
+
ssh.exec!("echo \"ssh-rsa #{pub_key['PublicKey']}\" >> ~/.ssh/authorized_keys")
|
48
|
+
ssh.exec!("chmod 600 ~/.ssh/authorized_keys")
|
49
|
+
end
|
50
|
+
|
51
|
+
# wait for ssh to be ready
|
52
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.ssh')
|
53
|
+
@client.wait_for_ssh(env, 3, 30)
|
54
|
+
|
55
|
+
# change authorized_keys file permissions, host name and set public network rules
|
56
|
+
@machine.communicate.execute(<<-BASH)
|
57
|
+
sed -i -e "s/127.0.1.1.*/127.0.1.1\t#{@machine.config.vm.hostname}/" /etc/hosts
|
58
|
+
sed -i -e "s/#{droplet['IP']}.*/#{droplet['IP']}\t#{@machine.config.vm.hostname}/" /etc/hosts
|
59
|
+
echo #{@machine.config.vm.hostname} > /etc/hostname
|
60
|
+
hostname #{@machine.config.vm.hostname}
|
61
|
+
|
62
|
+
ifdown -a
|
63
|
+
export INTERFACE=eth0
|
64
|
+
export MATCHADDR=$(ifconfig -a | grep eth0 | awk '{print $NF}')
|
65
|
+
export MATCHID=$(udevadm info /sys/class/net/eth0 | grep P: | awk -F/ '{print $(NF-2)}')
|
66
|
+
/lib/udev/write_net_rules
|
67
|
+
udevadm control --reload-rules && udevadm trigger
|
68
|
+
ifup -a
|
69
|
+
BASH
|
70
|
+
|
71
|
+
@machine.config.ssh.username = user
|
72
|
+
|
73
|
+
@app.call(env)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -27,37 +27,8 @@ module VagrantPlugins
|
|
27
27
|
@machine.config.ssh.username = 'root'
|
28
28
|
|
29
29
|
# wait for ssh to be ready
|
30
|
-
|
31
|
-
|
32
|
-
$i = 0
|
33
|
-
while $i <= $reboot_num do
|
34
|
-
$j = 0
|
35
|
-
while !@machine.communicate.ready? && $j < $check_num do
|
36
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.ssh_off')
|
37
|
-
sleep 10
|
38
|
-
$j += 1
|
39
|
-
end
|
40
|
-
|
41
|
-
if $j < $check_num
|
42
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.ssh_on')
|
43
|
-
break
|
44
|
-
else
|
45
|
-
if $i < $reboot_num
|
46
|
-
# submit reboot droplet request
|
47
|
-
result = @client.post("/server/#{@machine.id}/action", {
|
48
|
-
:Type => 'PowerReboot'
|
49
|
-
})
|
50
|
-
|
51
|
-
# wait for request to complete
|
52
|
-
env[:ui].info I18n.t('vagrant_1cloud.info.reloading')
|
53
|
-
@client.wait_for_event(env, @machine.id, result['body']['ID'])
|
54
|
-
|
55
|
-
$i += 1
|
56
|
-
else
|
57
|
-
raise 'No ssh connection'
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
30
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.ssh')
|
31
|
+
@client.wait_for_ssh(env, 3, 30)
|
61
32
|
|
62
33
|
@machine.config.ssh.username = user
|
63
34
|
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'vagrant-1cloud/helpers/client'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OneCloud
|
5
|
+
module Actions
|
6
|
+
class SetupKey
|
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::setup_key')
|
14
|
+
end
|
15
|
+
|
16
|
+
# TODO check the content of the key to see if it has changed
|
17
|
+
def call(env)
|
18
|
+
ssh_key_name = @machine.provider_config.ssh_key_name
|
19
|
+
|
20
|
+
begin
|
21
|
+
# assigns existing ssh key id to env for use by other commands
|
22
|
+
env[:ssh_key_id] = @client
|
23
|
+
.request('/sshkey')
|
24
|
+
.find_id(:body, :Title => ssh_key_name)
|
25
|
+
|
26
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.using_key', {
|
27
|
+
:name => ssh_key_name
|
28
|
+
})
|
29
|
+
rescue Errors::ResultMatchError
|
30
|
+
env[:ssh_key_id] = create_ssh_key(ssh_key_name, env)
|
31
|
+
end
|
32
|
+
|
33
|
+
puts env[:ssh_key_id]
|
34
|
+
|
35
|
+
@app.call(env)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def create_ssh_key(name, env)
|
41
|
+
# assumes public key exists on the same path as private key with .pub ext
|
42
|
+
path = @machine.config.ssh.private_key_path
|
43
|
+
path = path[0] if path.is_a?(Array)
|
44
|
+
path = File.expand_path(path, @machine.env.root_path)
|
45
|
+
pub_key = OneCloud.public_key(path)
|
46
|
+
|
47
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.creating_key', {
|
48
|
+
:name => name
|
49
|
+
})
|
50
|
+
|
51
|
+
result = @client.post('/sshkey', {
|
52
|
+
:Title => name,
|
53
|
+
:PublicKey => pub_key
|
54
|
+
})
|
55
|
+
result['body']['ID']
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module OneCloud
|
3
|
+
module Actions
|
4
|
+
class SetupSudo
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
@machine = env[:machine]
|
8
|
+
@logger = Log4r::Logger.new('vagrant::onecloud::setup_sudo')
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
# override ssh username to root
|
13
|
+
user = @machine.config.ssh.username
|
14
|
+
@machine.config.ssh.username = 'root'
|
15
|
+
|
16
|
+
# check for guest name available in Vagrant 1.2 first
|
17
|
+
guest_name = @machine.guest.name if @machine.guest.respond_to?(:name)
|
18
|
+
guest_name ||= @machine.guest.to_s.downcase
|
19
|
+
|
20
|
+
case guest_name
|
21
|
+
when /debian/
|
22
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.late_sudo_install_deb')
|
23
|
+
@machine.communicate.execute(<<-'BASH')
|
24
|
+
if [ ! -x /usr/bin/sudo ] ; then apt-get update -y && apt-get install -y sudo ; fi
|
25
|
+
BASH
|
26
|
+
when /redhat/
|
27
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.modifying_sudo')
|
28
|
+
|
29
|
+
# disable tty requirement for sudo
|
30
|
+
@machine.communicate.execute(<<-'BASH')
|
31
|
+
sed -i'.bk' -e 's/\(Defaults\s\+requiretty\)/# \1/' /etc/sudoers
|
32
|
+
BASH
|
33
|
+
end
|
34
|
+
|
35
|
+
# reset ssh username
|
36
|
+
@machine.config.ssh.username = user
|
37
|
+
|
38
|
+
@app.call(env)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -23,7 +23,7 @@ module VagrantPlugins
|
|
23
23
|
# create user account
|
24
24
|
@machine.communicate.execute(<<-BASH)
|
25
25
|
groupadd "#{user}"
|
26
|
-
useradd -m -d "/home/#{user}" -g "#{user}" -r "#{user}"
|
26
|
+
useradd -m -d "/home/#{user}" -g "#{user}" -r "#{user}" -s "/bin/bash"
|
27
27
|
chown #{user}:#{user} -R "/home/#{user}"
|
28
28
|
BASH
|
29
29
|
|
@@ -0,0 +1,135 @@
|
|
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
|
@@ -0,0 +1,29 @@
|
|
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
|
@@ -11,6 +11,7 @@ module VagrantPlugins
|
|
11
11
|
attr_accessor :hi_perf
|
12
12
|
attr_accessor :ca_path
|
13
13
|
attr_accessor :private_net
|
14
|
+
attr_accessor :ssh_key_name
|
14
15
|
|
15
16
|
def initialize
|
16
17
|
@token = UNSET_VALUE
|
@@ -23,6 +24,7 @@ module VagrantPlugins
|
|
23
24
|
@hi_perf = UNSET_VALUE
|
24
25
|
@ca_path = UNSET_VALUE
|
25
26
|
@private_net = UNSET_VALUE
|
27
|
+
@ssh_key_name = UNSET_VALUE
|
26
28
|
end
|
27
29
|
|
28
30
|
def finalize!
|
@@ -36,6 +38,7 @@ module VagrantPlugins
|
|
36
38
|
@hi_perf = false if @hi_perf == UNSET_VALUE
|
37
39
|
@ca_path = nil if @ca_path == UNSET_VALUE
|
38
40
|
@private_net = nil if @private_net == UNSET_VALUE
|
41
|
+
@ssh_key_name = 'Vagrant' if @ssh_key_name == UNSET_VALUE
|
39
42
|
end
|
40
43
|
|
41
44
|
def validate(machine)
|
@@ -56,4 +59,4 @@ module VagrantPlugins
|
|
56
59
|
end
|
57
60
|
end
|
58
61
|
end
|
59
|
-
end
|
62
|
+
end
|
@@ -17,6 +17,7 @@ module VagrantPlugins
|
|
17
17
|
def initialize(machine)
|
18
18
|
@logger = Log4r::Logger.new('vagrant::onecloud::apiclient')
|
19
19
|
@config = machine.provider_config
|
20
|
+
@machine = machine
|
20
21
|
@client = Faraday.new({
|
21
22
|
:url => 'https://api.1cloud.ru/',
|
22
23
|
:ssl => {
|
@@ -25,12 +26,12 @@ module VagrantPlugins
|
|
25
26
|
})
|
26
27
|
end
|
27
28
|
|
28
|
-
def delete(path, params = {}
|
29
|
+
def delete(path, params = {})
|
29
30
|
@client.request :url_encoded
|
30
31
|
request(path, params, :delete)
|
31
32
|
end
|
32
33
|
|
33
|
-
def post(path, params = {}
|
34
|
+
def post(path, params = {})
|
34
35
|
@client.headers['Content-Type'] = 'application/json'
|
35
36
|
request(path, params, :post)
|
36
37
|
end
|
@@ -38,6 +39,7 @@ module VagrantPlugins
|
|
38
39
|
def request(path, params = {}, method = :get)
|
39
40
|
begin
|
40
41
|
@logger.info "Request: #{path}"
|
42
|
+
@logger.info "Parameters: #{params}"
|
41
43
|
result = @client.send(method) do |req|
|
42
44
|
req.url path
|
43
45
|
req.headers['Authorization'] = "Bearer #{@config.token}"
|
@@ -104,6 +106,38 @@ module VagrantPlugins
|
|
104
106
|
raise 'Network is not active' if result['body']['State'] != 'Active'
|
105
107
|
end
|
106
108
|
end
|
109
|
+
|
110
|
+
def wait_for_ssh(env, reboot_num, check_num)
|
111
|
+
i = 0
|
112
|
+
while i <= reboot_num do
|
113
|
+
j = 0
|
114
|
+
while !@machine.communicate.ready? && j < check_num do
|
115
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.ssh_off')
|
116
|
+
sleep 10
|
117
|
+
j += 1
|
118
|
+
end
|
119
|
+
|
120
|
+
if j < check_num
|
121
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.ssh_on')
|
122
|
+
break
|
123
|
+
else
|
124
|
+
if i < reboot_num
|
125
|
+
# submit reboot droplet request
|
126
|
+
result = @client.post("/server/#{@machine.id}/action", {
|
127
|
+
:Type => 'PowerReboot'
|
128
|
+
})
|
129
|
+
|
130
|
+
# wait for request to complete
|
131
|
+
env[:ui].info I18n.t('vagrant_1cloud.info.reloading')
|
132
|
+
@client.wait_for_event(env, @machine.id, result['body']['ID'])
|
133
|
+
|
134
|
+
i += 1
|
135
|
+
else
|
136
|
+
raise 'No ssh connection'
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
107
141
|
end
|
108
142
|
end
|
109
143
|
end
|
@@ -16,6 +16,16 @@ module VagrantPlugins
|
|
16
16
|
require_relative 'provider'
|
17
17
|
Provider
|
18
18
|
end
|
19
|
+
|
20
|
+
command(:rebuild) do
|
21
|
+
require_relative 'commands/rebuild'
|
22
|
+
Commands::Rebuild
|
23
|
+
end
|
24
|
+
|
25
|
+
command("create-network") do
|
26
|
+
require_relative 'commands/create_network'
|
27
|
+
Commands::CreateNetwork
|
28
|
+
end
|
19
29
|
end
|
20
30
|
end
|
21
|
-
end
|
31
|
+
end
|
data/locales/en.yml
CHANGED
@@ -1,21 +1,32 @@
|
|
1
1
|
en:
|
2
2
|
vagrant_1cloud:
|
3
3
|
info:
|
4
|
-
off: "
|
5
|
-
not_created: "
|
6
|
-
already_active: "
|
7
|
-
already_off: "
|
8
|
-
creating: "Creating a new
|
9
|
-
destroying: "Destroying the
|
10
|
-
shutting_down: "Shutting down the
|
11
|
-
powering_off: "Powering off the
|
12
|
-
powering_on: "Powering on the
|
13
|
-
|
4
|
+
off: "VPS is off"
|
5
|
+
not_created: "VPS has not been created"
|
6
|
+
already_active: "VPS is already active"
|
7
|
+
already_off: "VPS is already off"
|
8
|
+
creating: "Creating a new VPS..."
|
9
|
+
destroying: "Destroying the VPS..."
|
10
|
+
shutting_down: "Shutting down the VPS..."
|
11
|
+
powering_off: "Powering off the VPS..."
|
12
|
+
powering_on: "Powering on the VPS..."
|
13
|
+
rebuilding: "Rebuilding the VPS..."
|
14
|
+
reloading: "Rebooting the VPS..."
|
14
15
|
creating_user: "Creating user account: %{user}..."
|
16
|
+
late_sudo_install_deb: "1clouds's debian image lacks sudo. Installing now."
|
17
|
+
modifying_sudo: "Modifying sudoers file to remove tty requirement..."
|
18
|
+
using_key: "Using existing SSH key: %{name}"
|
19
|
+
creating_key: "Creating new SSH key: %{name}..."
|
15
20
|
setting_private_network: "Setting private network..."
|
16
21
|
creating_private_network: "Creating private network..."
|
22
|
+
ssh: "Waiting for ssh to be ready"
|
17
23
|
ssh_off: "ssh connection is off"
|
18
24
|
ssh_on: "ssh connection is on"
|
25
|
+
network_exists: "Private network %{network} already exists"
|
26
|
+
network_missing: "Private network %{network} is missing"
|
27
|
+
request: "Request: %{path}"
|
28
|
+
params: "Parameters: %{params}"
|
29
|
+
response: "Response: %{body}"
|
19
30
|
config:
|
20
31
|
token: "Token is required"
|
21
32
|
private_key: "SSH private key path is required"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-1cloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bulat Yusupov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -62,6 +62,7 @@ files:
|
|
62
62
|
- ".gitignore"
|
63
63
|
- Gemfile
|
64
64
|
- LICENSE
|
65
|
+
- README.md
|
65
66
|
- Rakefile
|
66
67
|
- lib/vagrant-1cloud.rb
|
67
68
|
- lib/vagrant-1cloud/actions.rb
|
@@ -72,9 +73,14 @@ files:
|
|
72
73
|
- lib/vagrant-1cloud/actions/power_off.rb
|
73
74
|
- lib/vagrant-1cloud/actions/power_on.rb
|
74
75
|
- lib/vagrant-1cloud/actions/private_network.rb
|
76
|
+
- lib/vagrant-1cloud/actions/rebuild.rb
|
75
77
|
- lib/vagrant-1cloud/actions/reload.rb
|
78
|
+
- lib/vagrant-1cloud/actions/setup_key.rb
|
79
|
+
- lib/vagrant-1cloud/actions/setup_sudo.rb
|
76
80
|
- lib/vagrant-1cloud/actions/setup_user.rb
|
77
81
|
- lib/vagrant-1cloud/actions/shut_down.rb
|
82
|
+
- lib/vagrant-1cloud/commands/create_network.rb
|
83
|
+
- lib/vagrant-1cloud/commands/rebuild.rb
|
78
84
|
- lib/vagrant-1cloud/config.rb
|
79
85
|
- lib/vagrant-1cloud/errors.rb
|
80
86
|
- lib/vagrant-1cloud/helpers/client.rb
|
@@ -108,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
114
|
version: '0'
|
109
115
|
requirements: []
|
110
116
|
rubyforge_project:
|
111
|
-
rubygems_version: 2.
|
117
|
+
rubygems_version: 2.6.8
|
112
118
|
signing_key:
|
113
119
|
specification_version: 4
|
114
120
|
summary: Enables Vagrant to manage 1cloud droplets. Based on https://github.com/devopsgroup-io/vagrant-digitalocean.
|