vagrant-simplecloud 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/CHANGELOG.md +6 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +23 -0
- data/README.md +143 -0
- data/Rakefile +22 -0
- data/box/metadata.json +3 -0
- data/box/simple_cloud.box +0 -0
- data/lib/vagrant-simplecloud.rb +20 -0
- data/lib/vagrant-simplecloud/actions.rb +165 -0
- data/lib/vagrant-simplecloud/actions/check_state.rb +19 -0
- data/lib/vagrant-simplecloud/actions/create.rb +84 -0
- data/lib/vagrant-simplecloud/actions/destroy.rb +32 -0
- data/lib/vagrant-simplecloud/actions/modify_provision_path.rb +38 -0
- data/lib/vagrant-simplecloud/actions/power_off.rb +33 -0
- data/lib/vagrant-simplecloud/actions/power_on.rb +36 -0
- data/lib/vagrant-simplecloud/actions/rebuild.rb +56 -0
- data/lib/vagrant-simplecloud/actions/reload.rb +33 -0
- data/lib/vagrant-simplecloud/actions/setup_key.rb +53 -0
- data/lib/vagrant-simplecloud/actions/setup_sudo.rb +48 -0
- data/lib/vagrant-simplecloud/actions/setup_user.rb +66 -0
- data/lib/vagrant-simplecloud/actions/shut_down.rb +34 -0
- data/lib/vagrant-simplecloud/actions/sync_folders.rb +89 -0
- data/lib/vagrant-simplecloud/commands/list.rb +89 -0
- data/lib/vagrant-simplecloud/commands/rebuild.rb +29 -0
- data/lib/vagrant-simplecloud/config.rb +64 -0
- data/lib/vagrant-simplecloud/errors.rb +37 -0
- data/lib/vagrant-simplecloud/helpers/client.rb +151 -0
- data/lib/vagrant-simplecloud/helpers/result.rb +40 -0
- data/lib/vagrant-simplecloud/plugin.rb +31 -0
- data/lib/vagrant-simplecloud/provider.rb +102 -0
- data/lib/vagrant-simplecloud/version.rb +5 -0
- data/locales/en.yml +90 -0
- data/test/Vagrantfile +41 -0
- data/test/cookbooks/test/recipes/default.rb +1 -0
- data/test/scripts/provision.sh +3 -0
- data/test/test.sh +14 -0
- data/test/test_id_rsa +27 -0
- data/test/test_id_rsa.pub +1 -0
- data/testkit.rb +40 -0
- data/vagrant-simplecloud.gemspec +22 -0
- metadata +146 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f375943b185d2d11912d1b377fd48b175e0f0fdf
|
4
|
+
data.tar.gz: 14eb29009783fb3f39a33cfaa0470da9ae0fa96a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b797329c016f36b9bd3b4484a0e7fef389c9661fb67558dfff8b7eb5447a7dde49b4adf0751cfcc4abf0ec2b986c8488c9b6e0a4ecc89c0aa46b7ee05840d662
|
7
|
+
data.tar.gz: 9dda738e598ba6a9eae3f465b6f8de05e05c7b727ae57fed0ba2f84eed0d13c24159e987319195e19d26655012f675ea81140e5769f7bb34a5e904b0a6f94e63
|
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gem 'vagrant', :git => 'git://github.com/mitchellh/vagrant.git', :tag => 'v1.7.2'
|
4
|
+
#gem 'vagrant', :git => 'git://github.com/mitchellh/vagrant.git'
|
5
|
+
gem 'rake'
|
6
|
+
|
7
|
+
group :plugins do
|
8
|
+
gem 'vagrant-omnibus'
|
9
|
+
# gem 'vagrant-simplecloud', :path => '.'
|
10
|
+
gemspec
|
11
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Copyright (c) 2013 John Bender
|
2
|
+
Copyright (c) 2013 Shawn Dahlen
|
3
|
+
|
4
|
+
MIT License
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
7
|
+
a copy of this software and associated documentation files (the
|
8
|
+
"Software"), to deal in the Software without restriction, including
|
9
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
10
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
11
|
+
permit persons to whom the Software is furnished to do so, subject to
|
12
|
+
the following conditions:
|
13
|
+
|
14
|
+
The above copyright notice and this permission notice shall be
|
15
|
+
included in all copies or substantial portions of the Software.
|
16
|
+
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
18
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
19
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
20
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
21
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
22
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
23
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
Simple Cloud Vagrant Provider
|
2
|
+
==============================
|
3
|
+
|
4
|
+
`vagrant-simplecloud` is a provider plugin for Vagrant that supports the management of [Simple Cloud](https://www.simplecloud.ru/) droplets (instances).
|
5
|
+
|
6
|
+
Features include:
|
7
|
+
- create and destroy droplets
|
8
|
+
- power on and off droplets
|
9
|
+
- rebuild a droplet (destroys and ups with same IP address)
|
10
|
+
- provision a droplet with shell
|
11
|
+
- setup a SSH public key for authentication
|
12
|
+
- create a new user account during droplet creation
|
13
|
+
|
14
|
+
The provider has been tested with Vagrant 1.1.5+ using Ubuntu 12.04 and CentOS 6.3 guest operating systems.
|
15
|
+
|
16
|
+
|
17
|
+
Install
|
18
|
+
-------
|
19
|
+
Install the provider plugin using the Vagrant command-line interface:
|
20
|
+
|
21
|
+
`vagrant plugin install vagrant-simplecloud`
|
22
|
+
|
23
|
+
|
24
|
+
Configure
|
25
|
+
---------
|
26
|
+
Once the provider has been installed, you will need to configure your project to use it. The most basic `Vagrantfile` to create a droplet on Simple Cloud is shown below:
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
Vagrant.configure('2') do |config|
|
30
|
+
|
31
|
+
config.vm.provider :simple_cloud do |provider, override|
|
32
|
+
override.ssh.private_key_path = '~/.ssh/id_rsa'
|
33
|
+
override.vm.box = 'simple_cloud'
|
34
|
+
override.vm.box_url = "https://github.com/vadikgo/vagrant-simplecloud/raw/master/box/simple_cloud.box"
|
35
|
+
|
36
|
+
provider.token = ENV['DO_TOKEN']
|
37
|
+
provider.image = '123'
|
38
|
+
provider.region = 'base'
|
39
|
+
provider.size = '1'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
**Configuration Requirements**
|
45
|
+
- You *must* specify the `override.ssh.private_key_path` to enable authentication with the droplet. The provider will create a new Simple Cloud SSH key using your public key which is assumed to be the `private_key_path` with a *.pub* extension.
|
46
|
+
- You *must* specify your Simple Cloud Personal Access Token at `provider.token`. This may be found on the control panel within the *Apps & API* section.
|
47
|
+
|
48
|
+
**Supported Configuration Attributes**
|
49
|
+
|
50
|
+
The following attributes are available to further configure the provider:
|
51
|
+
- `provider.image`
|
52
|
+
* A string representing the image to use when creating a new droplet. It defaults to `ubuntu-14-04-x64`.
|
53
|
+
List available images with the `simplecloud-list images $DIGITAL_OCEAN_TOKEN` command. Like when using the SimpleCloud API directly, [it can be an image ID or slug](http://simplecloud.ru/features/api-manual/#_Create-new-VPS).
|
54
|
+
- `provider.ipv6`
|
55
|
+
* A boolean flag indicating whether to enable IPv6
|
56
|
+
- `provider.region`
|
57
|
+
* A string representing the region to create the new droplet in. It defaults to `base`. List available regions with the `simplecloud-list regions $DIGITAL_OCEAN_TOKEN` command.
|
58
|
+
- `provider.size`
|
59
|
+
* A string representing the size to use when creating a new droplet (e.g. `1gb`). It defaults to `512mb`. List available sizes with the `simplecloud-list sizes $DIGITAL_OCEAN_TOKEN` command.
|
60
|
+
- `provider.private_networking`
|
61
|
+
* A boolean flag indicating whether to enable a private network interface (if the region supports private networking). It defaults to `false`.
|
62
|
+
- `provider.backups_enabled`
|
63
|
+
* A boolean flag indicating whether to enable backups for the droplet. It defaults to `false`.
|
64
|
+
- `provider.ssh_key_name`
|
65
|
+
* A string representing the name to use when creating a Simple Cloud SSH key for droplet authentication. It defaults to `Vagrant`.
|
66
|
+
- `provider.setup`
|
67
|
+
* A boolean flag indicating whether to setup a new user account and modify sudo to disable tty requirement. It defaults to `true`. If you are using a tool like [Packer](https://packer.io) to create reusable snapshots with user accounts already provisioned, set to `false`.
|
68
|
+
- `config.vm.synced_folder`
|
69
|
+
* 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/"]`.
|
70
|
+
|
71
|
+
The provider will create a new user account with the specified SSH key for authorization if `config.ssh.username` is set and the `provider.setup` attribute is `true`.
|
72
|
+
|
73
|
+
|
74
|
+
Run
|
75
|
+
---
|
76
|
+
After creating your project's `Vagrantfile` with the required configuration
|
77
|
+
attributes described above, you may create a new droplet with the following
|
78
|
+
command:
|
79
|
+
|
80
|
+
$ vagrant up --provider=simple_cloud
|
81
|
+
|
82
|
+
This command will create a new droplet, setup your SSH key for authentication,
|
83
|
+
create a new user account, and run the provisioners you have configured.
|
84
|
+
|
85
|
+
**Supported Commands**
|
86
|
+
|
87
|
+
The provider supports the following Vagrant sub-commands:
|
88
|
+
- `vagrant destroy` - Destroys the droplet instance.
|
89
|
+
- `vagrant ssh` - Logs into the droplet instance using the configured user account.
|
90
|
+
- `vagrant halt` - Powers off the droplet instance.
|
91
|
+
- `vagrant provision` - Runs the configured provisioners and rsyncs any specified `config.vm.synced_folder`.
|
92
|
+
- `vagrant reload` - Reboots the droplet instance.
|
93
|
+
- `vagrant rebuild` - Destroys the droplet instance and recreates it with the same IP address which was previously assigned.
|
94
|
+
- `vagrant status` - Outputs the status (active, off, not created) for the droplet instance.
|
95
|
+
|
96
|
+
|
97
|
+
Troubleshooting
|
98
|
+
---------------
|
99
|
+
|
100
|
+
* `vagrant plugin install vagrant-simplecloud`
|
101
|
+
* 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`.
|
102
|
+
|
103
|
+
|
104
|
+
FAQ
|
105
|
+
---
|
106
|
+
|
107
|
+
* The Chef provisioner is no longer supported by default (as of 0.2.0). 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.
|
108
|
+
|
109
|
+
|
110
|
+
Contribute
|
111
|
+
----------
|
112
|
+
To contribute, fork then clone the repository, and then the following:
|
113
|
+
|
114
|
+
**Developing**
|
115
|
+
|
116
|
+
1. Install [Bundler](http://bundler.io/)
|
117
|
+
2. Currently the Bundler version is locked to 1.7.9, please install this version.
|
118
|
+
* `sudo gem install bundler -v '1.7.9'`
|
119
|
+
3. Then install vagrant-simplecloud dependancies:
|
120
|
+
* `bundle _1.7.9_ install`
|
121
|
+
4. Do your development and run a few commands, one to get started would be:
|
122
|
+
* `export DO_TOKEN="digital ocean type token"`
|
123
|
+
* `VAGRANT_LOG=info bundle _1.7.9_ exec vagrant simplecloud-list images $DO_TOKEN`
|
124
|
+
5. You can then run a test:
|
125
|
+
* `bundle _1.7.9_ exec rake test`
|
126
|
+
6. Once you are satisfied with your changes, please submit a pull request.
|
127
|
+
|
128
|
+
**Releasing**
|
129
|
+
|
130
|
+
To release a new version of vagrant-simplecloud you will need to do the following:
|
131
|
+
|
132
|
+
*(only contributors of the GitHub repo and owners of the project at RubyGems will have rights to do this)*
|
133
|
+
|
134
|
+
1. First, create a tag and push:
|
135
|
+
* `git tag -a v0.7.6 -m 'v0.7.6'`
|
136
|
+
2. Then, create a release on Github with the same versioning convention:
|
137
|
+
* https://github.com/vadikgo/vagrant-simplecloud/releases
|
138
|
+
3. You will then need to build and push the new gem to RubyGems:
|
139
|
+
* `rake gem:build`
|
140
|
+
* `gem push pkg/vagrant-simplecloud-0.7.6.gem`
|
141
|
+
4. Then, when John Doe runs the following, they will receive the updated vagrant-simplecloud plugin:
|
142
|
+
* `vagrant plugin update`
|
143
|
+
* `vagrant plugin update vagrant-simplecloud`
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'bundler/gem_helper'
|
2
|
+
|
3
|
+
namespace :gem do
|
4
|
+
Bundler::GemHelper.install_tasks
|
5
|
+
end
|
6
|
+
|
7
|
+
task :test do
|
8
|
+
result = sh 'bash test/test.sh'
|
9
|
+
|
10
|
+
if result
|
11
|
+
puts 'Success!'
|
12
|
+
else
|
13
|
+
puts 'Failure!'
|
14
|
+
exit 1
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def env
|
19
|
+
['DO_CLIENT_ID', 'DO_API_KEY', 'VAGRANT_LOG'].inject('') do |acc, key|
|
20
|
+
acc += "#{key}=#{ENV[key] || 'error'} "
|
21
|
+
end
|
22
|
+
end
|
data/box/metadata.json
ADDED
Binary file
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'vagrant-simplecloud/version'
|
2
|
+
require 'vagrant-simplecloud/plugin'
|
3
|
+
require 'vagrant-simplecloud/errors'
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module SimpleCloud
|
7
|
+
def self.source_root
|
8
|
+
@source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.public_key(private_key_path)
|
12
|
+
File.read("#{private_key_path}.pub")
|
13
|
+
rescue
|
14
|
+
raise Errors::PublicKeyError, :path => "#{private_key_path}.pub"
|
15
|
+
end
|
16
|
+
|
17
|
+
I18n.load_path << File.expand_path('locales/en.yml', source_root)
|
18
|
+
I18n.reload!
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
require 'vagrant-simplecloud/actions/check_state'
|
2
|
+
require 'vagrant-simplecloud/actions/create'
|
3
|
+
require 'vagrant-simplecloud/actions/destroy'
|
4
|
+
require 'vagrant-simplecloud/actions/shut_down'
|
5
|
+
require 'vagrant-simplecloud/actions/power_off'
|
6
|
+
require 'vagrant-simplecloud/actions/power_on'
|
7
|
+
require 'vagrant-simplecloud/actions/rebuild'
|
8
|
+
require 'vagrant-simplecloud/actions/reload'
|
9
|
+
require 'vagrant-simplecloud/actions/setup_user'
|
10
|
+
require 'vagrant-simplecloud/actions/setup_sudo'
|
11
|
+
require 'vagrant-simplecloud/actions/setup_key'
|
12
|
+
require 'vagrant-simplecloud/actions/sync_folders'
|
13
|
+
require 'vagrant-simplecloud/actions/modify_provision_path'
|
14
|
+
|
15
|
+
module VagrantPlugins
|
16
|
+
module SimpleCloud
|
17
|
+
module Actions
|
18
|
+
include Vagrant::Action::Builtin
|
19
|
+
|
20
|
+
def self.destroy
|
21
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
22
|
+
builder.use ConfigValidate
|
23
|
+
builder.use Call, CheckState do |env, b|
|
24
|
+
case env[:machine_state]
|
25
|
+
when :not_created
|
26
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.not_created')
|
27
|
+
else
|
28
|
+
b.use Call, DestroyConfirm do |env2, b2|
|
29
|
+
if env2[:result]
|
30
|
+
b2.use Destroy
|
31
|
+
b2.use ProvisionerCleanup if defined?(ProvisionerCleanup)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.ssh
|
40
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
41
|
+
builder.use ConfigValidate
|
42
|
+
builder.use Call, CheckState do |env, b|
|
43
|
+
case env[:machine_state]
|
44
|
+
when :active
|
45
|
+
b.use SSHExec
|
46
|
+
when :off
|
47
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.off')
|
48
|
+
when :not_created
|
49
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.not_created')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
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_simple_cloud.info.off')
|
64
|
+
when :not_created
|
65
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.not_created')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.provision
|
72
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
73
|
+
builder.use ConfigValidate
|
74
|
+
builder.use Call, CheckState do |env, b|
|
75
|
+
case env[:machine_state]
|
76
|
+
when :active
|
77
|
+
b.use Provision
|
78
|
+
b.use ModifyProvisionPath
|
79
|
+
b.use SyncFolders
|
80
|
+
when :off
|
81
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.off')
|
82
|
+
when :not_created
|
83
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.not_created')
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.up
|
90
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
91
|
+
builder.use ConfigValidate
|
92
|
+
builder.use Call, CheckState do |env, b|
|
93
|
+
case env[:machine_state]
|
94
|
+
when :active
|
95
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.already_active')
|
96
|
+
when :off
|
97
|
+
b.use PowerOn
|
98
|
+
b.use provision
|
99
|
+
when :not_created
|
100
|
+
b.use SetupKey
|
101
|
+
b.use Create
|
102
|
+
b.use SetupSudo
|
103
|
+
b.use SetupUser
|
104
|
+
b.use provision
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.halt
|
111
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
112
|
+
builder.use ConfigValidate
|
113
|
+
builder.use Call, CheckState do |env, b|
|
114
|
+
case env[:machine_state]
|
115
|
+
when :active
|
116
|
+
if env[:force_halt]
|
117
|
+
b.use PowerOff
|
118
|
+
else
|
119
|
+
b.use ShutDown
|
120
|
+
end
|
121
|
+
when :off
|
122
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.already_off')
|
123
|
+
when :not_created
|
124
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.not_created')
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.reload
|
131
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
132
|
+
builder.use ConfigValidate
|
133
|
+
builder.use Call, CheckState do |env, b|
|
134
|
+
case env[:machine_state]
|
135
|
+
when :active
|
136
|
+
b.use Reload
|
137
|
+
b.use provision
|
138
|
+
when :off
|
139
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.off')
|
140
|
+
when :not_created
|
141
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.not_created')
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.rebuild
|
148
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
149
|
+
builder.use ConfigValidate
|
150
|
+
builder.use Call, CheckState do |env, b|
|
151
|
+
case env[:machine_state]
|
152
|
+
when :active, :off
|
153
|
+
b.use Rebuild
|
154
|
+
b.use SetupSudo
|
155
|
+
b.use SetupUser
|
156
|
+
b.use provision
|
157
|
+
when :not_created
|
158
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.not_created')
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module SimpleCloud
|
3
|
+
module Actions
|
4
|
+
class CheckState
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
@machine = env[:machine]
|
8
|
+
@logger = Log4r::Logger.new('vagrant::simplecloud::check_state')
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
env[:machine_state] = @machine.state.id
|
13
|
+
@logger.info "Machine state is '#{@machine.state.id}'"
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'vagrant-simplecloud/helpers/client'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module SimpleCloud
|
5
|
+
module Actions
|
6
|
+
class Create
|
7
|
+
include Helpers::Client
|
8
|
+
include Vagrant::Util::Retryable
|
9
|
+
|
10
|
+
def initialize(app, env)
|
11
|
+
@app = app
|
12
|
+
@machine = env[:machine]
|
13
|
+
@client = client
|
14
|
+
@simple_client = simple_client
|
15
|
+
@logger = Log4r::Logger.new('vagrant::simplecloud::create')
|
16
|
+
end
|
17
|
+
|
18
|
+
def call(env)
|
19
|
+
ssh_key_id = [env[:ssh_key_id]]
|
20
|
+
|
21
|
+
# submit new droplet request
|
22
|
+
droplet = DropletKit::Droplet.new(name: @machine.config.vm.hostname || @machine.name, \
|
23
|
+
region: @machine.provider_config.region,\
|
24
|
+
size: @machine.provider_config.size, image: @machine.provider_config.image)
|
25
|
+
result = JSON.parse(@simple_client.droplets.create(droplet))
|
26
|
+
|
27
|
+
# wait for request to complete
|
28
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.creating')
|
29
|
+
|
30
|
+
raise 'droplet not ready, no actions_ids' unless result['droplet'].has_key?('action_ids')
|
31
|
+
@client.wait_for_event(env, result['droplet']['action_ids'].first)
|
32
|
+
|
33
|
+
# assign the machine id for reference in other commands
|
34
|
+
@machine.id = result['droplet']['id'].to_s
|
35
|
+
|
36
|
+
# refresh droplet state with provider and output ip address
|
37
|
+
droplet = Provider.droplet(@machine, :refresh => true)
|
38
|
+
public_network = droplet['networks']['v4'].find { |network| network['type'] == 'public' }
|
39
|
+
private_network = droplet['networks']['v4'].find { |network| network['type'] == 'private' }
|
40
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.droplet_ip', {
|
41
|
+
:ip => public_network['ip_address']
|
42
|
+
})
|
43
|
+
if private_network
|
44
|
+
env[:ui].info I18n.t('vagrant_simple_cloud.info.droplet_private_ip', {
|
45
|
+
:ip => private_network['ip_address']
|
46
|
+
})
|
47
|
+
end
|
48
|
+
|
49
|
+
# wait for ssh to be ready
|
50
|
+
switch_user = @machine.provider_config.setup?
|
51
|
+
user = @machine.config.ssh.username
|
52
|
+
@machine.config.ssh.username = 'root' if switch_user
|
53
|
+
|
54
|
+
retryable(:tries => 120, :sleep => 10) do
|
55
|
+
next if env[:interrupted]
|
56
|
+
raise 'not ready' if !@machine.communicate.ready?
|
57
|
+
end
|
58
|
+
|
59
|
+
@machine.config.ssh.username = user
|
60
|
+
|
61
|
+
@app.call(env)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Both the recover and terminate are stolen almost verbatim from
|
65
|
+
# the Vagrant AWS provider up action
|
66
|
+
def recover(env)
|
67
|
+
return if env['vagrant.error'].is_a?(Vagrant::Errors::VagrantError)
|
68
|
+
|
69
|
+
if @machine.state.id != :not_created
|
70
|
+
terminate(env)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def terminate(env)
|
75
|
+
destroy_env = env.dup
|
76
|
+
destroy_env.delete(:interrupted)
|
77
|
+
destroy_env[:config_validate] = false
|
78
|
+
destroy_env[:force_confirm_destroy] = true
|
79
|
+
env[:action_runner].run(Actions.destroy, destroy_env)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|