vagrant-abiquo 0.0.1
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 +7 -0
- data/CHANGELOG.md +6 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +106 -0
- data/LICENSE.txt +22 -0
- data/README.md +106 -0
- data/Rakefile +22 -0
- data/Vagrantfile +21 -0
- data/box/abiquo.box +0 -0
- data/box/metadata.json +3 -0
- data/lib/vagrant-abiquo.rb +14 -0
- data/lib/vagrant-abiquo/actions.rb +86 -0
- data/lib/vagrant-abiquo/actions/check_state.rb +19 -0
- data/lib/vagrant-abiquo/actions/create.rb +113 -0
- data/lib/vagrant-abiquo/actions/destroy.rb +35 -0
- data/lib/vagrant-abiquo/actions/modify_provision_path.rb +38 -0
- data/lib/vagrant-abiquo/actions/power_off.rb +33 -0
- data/lib/vagrant-abiquo/actions/power_on.rb +34 -0
- data/lib/vagrant-abiquo/actions/reload.rb +31 -0
- data/lib/vagrant-abiquo/config.rb +49 -0
- data/lib/vagrant-abiquo/errors.rb +33 -0
- data/lib/vagrant-abiquo/helpers/client.rb +149 -0
- data/lib/vagrant-abiquo/helpers/result.rb +40 -0
- data/lib/vagrant-abiquo/plugin.rb +22 -0
- data/lib/vagrant-abiquo/provider.rb +121 -0
- data/lib/vagrant-abiquo/version.rb +5 -0
- data/locales/en.yml +103 -0
- data/test/Vagrantfile +22 -0
- data/test/scripts/provision.sh +3 -0
- data/test/test.sh +11 -0
- data/vagrant-abiquo.gemspec +21 -0
- metadata +118 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 38864b2ac0132ec39bc8ad85c49af85cf8b3ced4
|
4
|
+
data.tar.gz: 5371bf394611a016465041a475dc220716a172e8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 785aab0851790885c4376c71454f09be252c936b2d8e07cdac72821904d9c5b40dc1d42331dc3da04e05b000a2818e94210a3957f3da1e0dd83826343dafe574
|
7
|
+
data.tar.gz: 2d9f200d45754a690028e77e519b82bad966ede1017e9e5ae5ea1d74cfa9edfb1cc668f262021f2e72c13b277f21093fae26658b8d40e0bacc05f6daca415239
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
GIT
|
2
|
+
remote: git://github.com/mitchellh/vagrant.git
|
3
|
+
revision: 85d63a91f7aff7c16afee1dbc8bccc11cc6faa5e
|
4
|
+
tag: v1.6.3
|
5
|
+
specs:
|
6
|
+
vagrant (1.6.3)
|
7
|
+
bundler (>= 1.5.2, < 1.7.0)
|
8
|
+
childprocess (~> 0.5.0)
|
9
|
+
erubis (~> 2.7.0)
|
10
|
+
i18n (~> 0.6.0)
|
11
|
+
listen (~> 2.7.1)
|
12
|
+
log4r (~> 1.1.9, < 1.1.11)
|
13
|
+
net-scp (~> 1.1.0)
|
14
|
+
net-ssh (>= 2.6.6, < 2.10.0)
|
15
|
+
rb-kqueue (~> 0.2.0)
|
16
|
+
wdm (~> 0.1.0)
|
17
|
+
winrm (~> 1.1.3)
|
18
|
+
|
19
|
+
PATH
|
20
|
+
remote: .
|
21
|
+
specs:
|
22
|
+
vagrant-abiquo (0.0.1)
|
23
|
+
json
|
24
|
+
log4r
|
25
|
+
rest-client (>= 1.6.7)
|
26
|
+
|
27
|
+
GEM
|
28
|
+
remote: https://rubygems.org/
|
29
|
+
specs:
|
30
|
+
akami (1.2.2)
|
31
|
+
gyoku (>= 0.4.0)
|
32
|
+
nokogiri
|
33
|
+
builder (3.2.2)
|
34
|
+
celluloid (0.15.2)
|
35
|
+
timers (~> 1.1.0)
|
36
|
+
childprocess (0.5.3)
|
37
|
+
ffi (~> 1.0, >= 1.0.11)
|
38
|
+
erubis (2.7.0)
|
39
|
+
ffi (1.9.3)
|
40
|
+
gssapi (1.0.3)
|
41
|
+
ffi (>= 1.0.1)
|
42
|
+
gyoku (1.1.1)
|
43
|
+
builder (>= 2.1.2)
|
44
|
+
httpclient (2.3.4.1)
|
45
|
+
httpi (0.9.7)
|
46
|
+
rack
|
47
|
+
i18n (0.6.9)
|
48
|
+
json (1.8.1)
|
49
|
+
listen (2.7.6)
|
50
|
+
celluloid (>= 0.15.2)
|
51
|
+
rb-fsevent (>= 0.9.3)
|
52
|
+
rb-inotify (>= 0.9)
|
53
|
+
little-plugger (1.1.3)
|
54
|
+
log4r (1.1.10)
|
55
|
+
logging (1.8.2)
|
56
|
+
little-plugger (>= 1.1.3)
|
57
|
+
multi_json (>= 1.8.4)
|
58
|
+
mime-types (2.3)
|
59
|
+
mini_portile (0.6.0)
|
60
|
+
multi_json (1.10.1)
|
61
|
+
net-scp (1.1.2)
|
62
|
+
net-ssh (>= 2.6.5)
|
63
|
+
net-ssh (2.9.1)
|
64
|
+
nokogiri (1.6.2.1)
|
65
|
+
mini_portile (= 0.6.0)
|
66
|
+
nori (1.1.5)
|
67
|
+
rack (1.5.2)
|
68
|
+
rake (10.3.2)
|
69
|
+
rb-fsevent (0.9.4)
|
70
|
+
rb-inotify (0.9.4)
|
71
|
+
ffi (>= 0.5.0)
|
72
|
+
rb-kqueue (0.2.3)
|
73
|
+
ffi (>= 0.5.0)
|
74
|
+
rest-client (1.6.7)
|
75
|
+
mime-types (>= 1.16)
|
76
|
+
rubyntlm (0.1.1)
|
77
|
+
savon (0.9.5)
|
78
|
+
akami (~> 1.0)
|
79
|
+
builder (>= 2.1.2)
|
80
|
+
gyoku (>= 0.4.0)
|
81
|
+
httpi (~> 0.9)
|
82
|
+
nokogiri (>= 1.4.0)
|
83
|
+
nori (~> 1.0)
|
84
|
+
wasabi (~> 1.0)
|
85
|
+
timers (1.1.0)
|
86
|
+
uuidtools (2.1.4)
|
87
|
+
wasabi (1.0.0)
|
88
|
+
nokogiri (>= 1.4.0)
|
89
|
+
wdm (0.1.0)
|
90
|
+
winrm (1.1.3)
|
91
|
+
gssapi (~> 1.0.0)
|
92
|
+
httpclient (~> 2.2, >= 2.2.0.2)
|
93
|
+
logging (~> 1.6, >= 1.6.1)
|
94
|
+
nokogiri (~> 1.5)
|
95
|
+
rubyntlm (~> 0.1.1)
|
96
|
+
savon (= 0.9.5)
|
97
|
+
uuidtools (~> 2.1.2)
|
98
|
+
|
99
|
+
PLATFORMS
|
100
|
+
ruby
|
101
|
+
|
102
|
+
DEPENDENCIES
|
103
|
+
rake
|
104
|
+
rest-client
|
105
|
+
vagrant!
|
106
|
+
vagrant-abiquo!
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Daniel Beneyto
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
Abiquo Vagrant Provider
|
2
|
+
==============================
|
3
|
+
`vagrant-abiquo` is a provider plugin for Vagrant that supports the
|
4
|
+
management of [Abiquo](https://www.abiquo.com/) virtual machines
|
5
|
+
|
6
|
+
Current features include:
|
7
|
+
- create and destroy virtualmachines
|
8
|
+
- power on and off virtualmachines
|
9
|
+
|
10
|
+
The provider has been tested with Vagrant 1.4.x using Ubuntu 12.04 and
|
11
|
+
CentOS 6.3 guest operating systems.
|
12
|
+
|
13
|
+
Install
|
14
|
+
-------
|
15
|
+
Installation of the provider requires two steps:
|
16
|
+
|
17
|
+
1. Install the provider plugin using the Vagrant command-line interface:
|
18
|
+
|
19
|
+
$ vagrant plugin install vagrant-abiquo
|
20
|
+
|
21
|
+
|
22
|
+
Configure
|
23
|
+
---------
|
24
|
+
Once the provider has been installed, you will need to configure your project
|
25
|
+
to use it. The most basic `Vagrantfile` to create a droplet on Digital Ocean
|
26
|
+
is shown below:
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
Vagrantfile content goes here
|
30
|
+
```
|
31
|
+
|
32
|
+
Please note the following:
|
33
|
+
- You *must* specify the `override.ssh.private_key_path` to enable authentication
|
34
|
+
with the droplet. The provider will create a new Digital Ocean SSH key using
|
35
|
+
your public key which is assumed to be the `private_key_path` with a *.pub*
|
36
|
+
extension.
|
37
|
+
- You *must* specify your Digital Ocean Client and API keys. These may be
|
38
|
+
found on the control panel within the *My Settings > API Access* section.
|
39
|
+
|
40
|
+
**Supported Configuration Attributes**
|
41
|
+
|
42
|
+
The following attributes are available to further configure the provider:
|
43
|
+
- `provider.image` - A string representing the image to use when creating a
|
44
|
+
new droplet (e.g. `Debian 6.0 x64`). The available options may
|
45
|
+
be found on Digital Ocean's new droplet [form](https://www.digitalocean.com/droplets/new).
|
46
|
+
It defaults to `Ubuntu 14.04.3 x64`.
|
47
|
+
- `provider.region` - A string representing the region to create the new
|
48
|
+
droplet in. It defaults to `New York 2`.
|
49
|
+
- `provider.size` - A string representing the size to use when creating a
|
50
|
+
new droplet (e.g. `1GB`). It defaults to `512MB`.
|
51
|
+
- `provider.private_networking` - A boolean flag indicating whether to enable
|
52
|
+
a private network interface (if the region supports private networking). It
|
53
|
+
defaults to `false`.
|
54
|
+
- `provider.backups_enabled` - A boolean flag indicating whether to enable backups for
|
55
|
+
the droplet. It defaults to `false`.
|
56
|
+
- `provider.ssh_key_name` - A string representing the name to use when creating
|
57
|
+
a Digital Ocean SSH key for droplet authentication. It defaults to `Vagrant`.
|
58
|
+
- `provider.setup` - A boolean flag indicating whether to setup a new user
|
59
|
+
account and modify sudo to disable tty requirement. It defaults to `true`.
|
60
|
+
If you are using a tool like [packer](https://packer.io) to create
|
61
|
+
reusable snapshots with user accounts already provisioned, set to `false`.
|
62
|
+
|
63
|
+
The provider will create a new user account with the specified SSH key for
|
64
|
+
authorization if `config.ssh.username` is set and the `provider.setup`
|
65
|
+
attribute is `true`.
|
66
|
+
|
67
|
+
Run
|
68
|
+
---
|
69
|
+
After creating your project's `Vagrantfile` with the required configuration
|
70
|
+
attributes described above, you may create a new droplet with the following
|
71
|
+
command:
|
72
|
+
|
73
|
+
$ vagrant up --provider=digital_ocean
|
74
|
+
|
75
|
+
This command will create a new droplet, setup your SSH key for authentication,
|
76
|
+
create a new user account, and run the provisioners you have configured.
|
77
|
+
|
78
|
+
**Supported Commands**
|
79
|
+
|
80
|
+
The provider supports the following Vagrant sub-commands:
|
81
|
+
- `vagrant destroy` - Destroys the droplet instance.
|
82
|
+
- `vagrant ssh` - Logs into the droplet instance using the configured user
|
83
|
+
account.
|
84
|
+
- `vagrant halt` - Powers off the droplet instance.
|
85
|
+
- `vagrant provision` - Runs the configured provisioners and rsyncs any
|
86
|
+
specified `config.vm.synced_folder`.
|
87
|
+
- `vagrant reload` - Reboots the droplet instance.
|
88
|
+
- `vagrant rebuild` - Destroys the droplet instance and recreates it with the
|
89
|
+
same IP address is was assigned to previously.
|
90
|
+
- `vagrant status` - Outputs the status (active, off, not created) for the
|
91
|
+
droplet instance.
|
92
|
+
|
93
|
+
Contribute
|
94
|
+
----------
|
95
|
+
To contribute, clone the repository, and use [Bundler](http://gembundler.com)
|
96
|
+
to install dependencies:
|
97
|
+
|
98
|
+
$ bundle
|
99
|
+
|
100
|
+
To run the provider's tests:
|
101
|
+
|
102
|
+
$ bundle exec rake test
|
103
|
+
|
104
|
+
You can now make modifications. Running `vagrant` within the Bundler
|
105
|
+
environment will ensure that plugins installed in your Vagrant
|
106
|
+
environment are not loaded.
|
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
|
+
['ABIQUO_API_USER', 'ABIQUO_API_PASSWORD', 'VAGRANT_LOG'].inject('') do |acc, key|
|
20
|
+
acc += "#{key}=#{ENV[key] || 'error'} "
|
21
|
+
end
|
22
|
+
end
|
data/Vagrantfile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
VAGRANTFILE_API_VERSION = "2"
|
2
|
+
|
3
|
+
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
4
|
+
config.vm.define 'abiquotesting' do |t|
|
5
|
+
end
|
6
|
+
config.vm.provider :abiquo do |provider, override|
|
7
|
+
override.vm.box = 'abiquo'
|
8
|
+
override.vm.box_url = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"
|
9
|
+
override.vm.hostname = 'abiquotesting'
|
10
|
+
|
11
|
+
provider.abiquo_api_user = 'admin'
|
12
|
+
provider.abiquo_api_password = 'xabiquo'
|
13
|
+
provider.abiquo_api_uri = 'https://preproduction.bcn.abiquo.com:443/api'
|
14
|
+
provider.virtualdatacenter = 'testVDC'
|
15
|
+
provider.virtualappliance = 'testing'
|
16
|
+
provider.label = 'MyVagrantVM'
|
17
|
+
# Nic which is exposed for SSH access
|
18
|
+
provider.exposed_nic = 'nic0'
|
19
|
+
provider.template = 'CoreVMDK'
|
20
|
+
end
|
21
|
+
end
|
data/box/abiquo.box
ADDED
Binary file
|
data/box/metadata.json
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'vagrant-abiquo/version'
|
2
|
+
require 'vagrant-abiquo/plugin'
|
3
|
+
require 'vagrant-abiquo/errors'
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module Abiquo
|
7
|
+
def self.source_root
|
8
|
+
@source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
|
9
|
+
end
|
10
|
+
|
11
|
+
I18n.load_path << File.expand_path('locales/en.yml', source_root)
|
12
|
+
I18n.reload!
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'vagrant-abiquo/actions/check_state'
|
2
|
+
require 'vagrant-abiquo/actions/create'
|
3
|
+
require 'vagrant-abiquo/actions/destroy'
|
4
|
+
require 'vagrant-abiquo/actions/power_off'
|
5
|
+
require 'vagrant-abiquo/actions/power_on'
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module Abiquo
|
9
|
+
module Actions
|
10
|
+
include Vagrant::Action::Builtin
|
11
|
+
|
12
|
+
def self.destroy
|
13
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
14
|
+
builder.use ConfigValidate
|
15
|
+
builder.use Call, CheckState do |env, b|
|
16
|
+
case env[:machine_state]
|
17
|
+
when :not_created
|
18
|
+
env[:ui].info I18n.t('vagrant_abiquo.info.not_created')
|
19
|
+
else
|
20
|
+
b.use Call, DestroyConfirm do |env2, b2|
|
21
|
+
if env2[:result]
|
22
|
+
b2.use Destroy
|
23
|
+
b2.use ProvisionerCleanup if defined?(ProvisionerCleanup)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.provision
|
32
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
33
|
+
builder.use ConfigValidate
|
34
|
+
builder.use Call, CheckState do |env, b|
|
35
|
+
case env[:machine_state]
|
36
|
+
when :active
|
37
|
+
b.use Provision
|
38
|
+
b.use ModifyProvisionPath
|
39
|
+
b.use SyncFolders
|
40
|
+
when :off
|
41
|
+
env[:ui].info I18n.t('vagrant_abiquo.info.off')
|
42
|
+
when :not_created
|
43
|
+
env[:ui].info I18n.t('vagrant_abiquo.info.not_created')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.up
|
50
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
51
|
+
builder.use ConfigValidate
|
52
|
+
builder.use Call, CheckState do |env, b|
|
53
|
+
case env[:machine_state]
|
54
|
+
when :active
|
55
|
+
env[:ui].info I18n.t('vagrant_abiquo.info.already_active')
|
56
|
+
when :off
|
57
|
+
b.use PowerOn
|
58
|
+
b.use provision
|
59
|
+
when :not_created
|
60
|
+
b.use Create
|
61
|
+
b.use provision
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.halt
|
68
|
+
return Vagrant::Action::Builder.new.tap do |builder|
|
69
|
+
builder.use ConfigValidate
|
70
|
+
builder.use Call, CheckState do |env, b|
|
71
|
+
case env[:machine_state]
|
72
|
+
when :active
|
73
|
+
b.use PowerOff
|
74
|
+
when :off
|
75
|
+
env[:ui].info I18n.t('vagrant_abiquo.info.already_off')
|
76
|
+
when :not_created
|
77
|
+
env[:ui].info I18n.t('vagrant_abiquo.info.not_created')
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Abiquo
|
3
|
+
module Actions
|
4
|
+
class CheckState
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
@machine = env[:machine]
|
8
|
+
@logger = Log4r::Logger.new('vagrant::abiquo::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,113 @@
|
|
1
|
+
require 'vagrant-abiquo/helpers/client'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Abiquo
|
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
|
+
@logger = Log4r::Logger.new('vagrant::abiquo::create')
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
# Find for selected virtual datacenter
|
19
|
+
vdcs_accept = {:accept => "application/vnd.abiquo.virtualdatacenters+json" }
|
20
|
+
virtualdatacenters = @client.http_request(@machine.provider_config.abiquo_api_uri+"/cloud/virtualdatacenters?limit=0","GET", vdcs_accept)
|
21
|
+
virtualdatacenter_id = @client.find_id("VirtualDatacener",virtualdatacenters, @machine.provider_config.virtualdatacenter)
|
22
|
+
# Find for selected virtual appliance
|
23
|
+
vapps_accept = {:accept => "application/vnd.abiquo.virtualappliances+json" }
|
24
|
+
virtualappliances = @client.http_request(@machine.provider_config.abiquo_api_uri+"/cloud/virtualdatacenters/#{virtualdatacenter_id}/virtualappliances?limit=0","GET",vapps_accept)
|
25
|
+
virtualappliance_id = @client.find_id("VirtualAppliance",virtualappliances, @machine.provider_config.virtualappliance)
|
26
|
+
# Find for selected vm template
|
27
|
+
templates_accept = {:accept => "application/vnd.abiquo.virtualmachinetemplates+json"}
|
28
|
+
templates = @client.http_request(@machine.provider_config.abiquo_api_uri+"/cloud/virtualdatacenters/#{virtualdatacenter_id}/action/templates?limit=0","GET",templates_accept)
|
29
|
+
template_href = @client.find_template("Template",templates, @machine.provider_config.template)
|
30
|
+
|
31
|
+
# If everything is OK we can proceed to create the VM
|
32
|
+
# VM Template link
|
33
|
+
link = {}
|
34
|
+
link['title'] = @machine.provider_config.template
|
35
|
+
link['rel'] = "virtualmachinetemplate"
|
36
|
+
link['type'] = "application/vnd.abiquo.virtualmachinetemplate+json"
|
37
|
+
link['href'] = template_href
|
38
|
+
|
39
|
+
# VM entity
|
40
|
+
vm_definition = {}
|
41
|
+
vm_definition['label'] = @machine.provider_config.label
|
42
|
+
vm_definition['vdrpEnabled'] = true
|
43
|
+
vm_definition['links'] = Array.new
|
44
|
+
vm_definition['links'][0] = link
|
45
|
+
|
46
|
+
# POST Headers
|
47
|
+
vm_post_headers = { :content_type => "application/vnd.abiquo.virtualmachine+json", :accept => "application/vnd.abiquo.virtualmachine+json" }
|
48
|
+
|
49
|
+
# Creating VM in Abiquo
|
50
|
+
env[:ui].info I18n.t('vagrant_abiquo.info.creating')
|
51
|
+
@vm = JSON.parse(@client.http_request(@machine.provider_config.abiquo_api_uri+"/cloud/virtualdatacenters/#{virtualdatacenter_id}/virtualappliances/#{virtualappliance_id}/virtualmachines","POST",vm_post_headers,vm_definition.to_json))
|
52
|
+
|
53
|
+
# Deploying VM
|
54
|
+
env[:ui].info I18n.t('vagrant_abiquo.info.deploying')
|
55
|
+
@vm['links'].each do |link|
|
56
|
+
if link['rel'].eql? "deploy"
|
57
|
+
@task = JSON.parse(@client.http_request(link['href'],"POST",:accept => link['type']))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Check when deploy finishes. This may take a while
|
62
|
+
retryable(:tries => 120, :sleep => 10) do
|
63
|
+
# TO-DO: Add content-type headers to GET request
|
64
|
+
@task_state = JSON.parse(@client.http_request(@task['links'][0]['href'],"GET"))
|
65
|
+
raise 'DeployInProgress' if @task_state['state'] == 'STARTED'
|
66
|
+
end
|
67
|
+
|
68
|
+
if @task_state['state'] == 'FINISHED_SUCCESSFULLY'
|
69
|
+
# Deploy successfully completed
|
70
|
+
env[:ui].info I18n.t('vagrant_abiquo.info.deploycompleted')
|
71
|
+
@vm['links'].each do |link|
|
72
|
+
if link['rel'].eql? "edit"
|
73
|
+
@vm = JSON.parse(@client.http_request(link['href'],"GET"))
|
74
|
+
end
|
75
|
+
end
|
76
|
+
@vm['links'].each do |link|
|
77
|
+
if link['rel'].eql? @machine.provider_config.exposed_nic
|
78
|
+
# Refresh vm state with provider and output ip address
|
79
|
+
virtualmachine = Provider.virtualmachine(@machine)
|
80
|
+
env[:ui].info I18n.t('vagrant_abiquo.info.vm_ip', {:ip => link['title']})
|
81
|
+
# Assign the machine id for reference in other commands
|
82
|
+
@machine.id = @vm['id'].to_s
|
83
|
+
end
|
84
|
+
end
|
85
|
+
else
|
86
|
+
# Deploy failed
|
87
|
+
env[:ui].info I18n.t('vagrant_abiquo.info.deployfailed')
|
88
|
+
end
|
89
|
+
|
90
|
+
@app.call(env)
|
91
|
+
end
|
92
|
+
|
93
|
+
# Both the recover and terminate are stolen almost verbatim from
|
94
|
+
# the Vagrant AWS provider up action
|
95
|
+
def recover(env)
|
96
|
+
return if env['vagrant.error'].is_a?(Vagrant::Errors::VagrantError)
|
97
|
+
|
98
|
+
if @machine.state.id != :not_created
|
99
|
+
terminate(env)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def terminate(env)
|
104
|
+
destroy_env = env.dup
|
105
|
+
destroy_env.delete(:interrupted)
|
106
|
+
destroy_env[:config_validate] = false
|
107
|
+
destroy_env[:force_confirm_destroy] = true
|
108
|
+
env[:action_runner].run(Actions.destroy, destroy_env)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|