vagrant-abiquo 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,22 @@
1
+ module VagrantPlugins
2
+ module Abiquo
3
+ class Plugin < Vagrant.plugin('2')
4
+ name 'Abiquo'
5
+ description <<-DESC
6
+ This plugin installs a provider that allows Vagrant to manage
7
+ machines using Abiquo's API.
8
+ DESC
9
+
10
+ config(:abiquo, :provider) do
11
+ require_relative 'config'
12
+ Config
13
+ end
14
+
15
+ provider(:abiquo) do
16
+ require_relative 'provider'
17
+ Provider
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,121 @@
1
+ require 'vagrant-abiquo/actions'
2
+
3
+ module VagrantPlugins
4
+ module Abiquo
5
+ class Provider < Vagrant.plugin('2', :provider)
6
+
7
+ # This class method caches status for all droplets within
8
+ # the Digital Ocean account. A specific droplet's status
9
+ # may be refreshed by passing :refresh => true as an option.
10
+ def self.virtualmachine(machine)
11
+ @client = Helpers::ApiClient.new(machine)
12
+ if !@virtualmachines
13
+ vms_accept = {:accept => "application/vnd.abiquo.virtualmachines+json" }
14
+ @virtualmachines = JSON.parse(@client.http_request(machine.provider_config.abiquo_api_uri+"/cloud/virtualmachines?limit=0","GET", vms_accept))
15
+ end
16
+
17
+ @virtualmachines['collection'].each do |vm|
18
+
19
+ puts "VM id --> "+machine.id if not machine.id.nil?
20
+ puts "Lista de VMs -->"+vm['id'].to_s
21
+ if vm['id'].to_s == machine.id
22
+ virtualmachine ||= {'status' => 'active'}
23
+ @found = true
24
+ end
25
+ end
26
+ if not @found
27
+ virtualmachine ||= {'status' => 'not_created'}
28
+ end
29
+ end
30
+
31
+ def self.droplet(machine, opts = {})
32
+ client = Helpers::ApiClient.new(machine)
33
+
34
+ # load status of droplets if it has not been done before
35
+ if !@droplets
36
+ result = client.request('/droplets')
37
+ @droplets = result['droplets']
38
+ end
39
+
40
+ if opts[:refresh] && machine.id
41
+ # refresh the droplet status for the given machine
42
+ @droplets.delete_if { |d| d['id'].to_s == machine.id }
43
+ result = client.request("/droplets/#{machine.id}")
44
+ @droplets << droplet = result['droplet']
45
+ else
46
+ # lookup droplet status for the given machine
47
+ droplet = @droplets.find { |d| d['id'].to_s == machine.id }
48
+ end
49
+
50
+ # if lookup by id failed, check for a droplet with a matching name
51
+ # and set the id to ensure vagrant stores locally
52
+ # TODO allow the user to configure this behavior
53
+ if !droplet
54
+ name = machine.config.vm.hostname || machine.name
55
+ droplet = @droplets.find { |d| d['name'] == name.to_s }
56
+ machine.id = droplet['id'].to_s if droplet
57
+ end
58
+
59
+ droplet ||= {'status' => 'not_created'}
60
+ end
61
+
62
+ def initialize(machine)
63
+ @machine = machine
64
+ end
65
+
66
+ def action(name)
67
+ return Actions.send(name) if Actions.respond_to?(name)
68
+ nil
69
+ end
70
+
71
+ # This method is called if the underying machine ID changes. Providers
72
+ # can use this method to load in new data for the actual backing
73
+ # machine or to realize that the machine is now gone (the ID can
74
+ # become `nil`). No parameters are given, since the underlying machine
75
+ # is simply the machine instance given to this object. And no
76
+ # return value is necessary.
77
+ def machine_id_changed
78
+ end
79
+
80
+ # This should return a hash of information that explains how to
81
+ # SSH into the machine. If the machine is not at a point where
82
+ # SSH is even possible, then `nil` should be returned.
83
+ #
84
+ # The general structure of this returned hash should be the
85
+ # following:
86
+ #
87
+ # {
88
+ # :host => "1.2.3.4",
89
+ # :port => "22",
90
+ # :username => "mitchellh",
91
+ # :private_key_path => "/path/to/my/key"
92
+ # }
93
+ #
94
+ # **Note:** Vagrant only supports private key based authenticatonion,
95
+ # mainly for the reason that there is no easy way to exec into an
96
+ # `ssh` prompt with a password, whereas we can pass a private key
97
+ # via commandline.
98
+ def ssh_info
99
+ droplet = Provider.droplet(@machine)
100
+
101
+ return nil if droplet['status'].to_sym != :active
102
+
103
+ return {
104
+ :host => droplet['ip_address'],
105
+ :port => '22',
106
+ :username => 'root',
107
+ :private_key_path => nil
108
+ }
109
+ end
110
+
111
+ # This should return the state of the machine within this provider.
112
+ # The state must be an instance of {MachineState}. Please read the
113
+ # documentation of that class for more information.
114
+ def state
115
+ state = Provider.virtualmachine(@machine)['status'].to_sym
116
+ long = short = state.to_s
117
+ Vagrant::MachineState.new(state, short, long)
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,5 @@
1
+ module VagrantPlugins
2
+ module Abiquo
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
@@ -0,0 +1,103 @@
1
+ en:
2
+ vagrant_abiquo:
3
+ info:
4
+ off: "VM is off"
5
+ not_created: "VM has not been created"
6
+ already_active: "VM is already active"
7
+ already_off: "VM is already off"
8
+ creating: "Creating VM..."
9
+ deploying: "Deploying VM..."
10
+ deploycompleted: "VM deploy completed successfully"
11
+ deployfailed: "VM deploy failed. Look to Abiquo events."
12
+ vm_ip: "Assigned IP address: %{ip}"
13
+ vm_private_ip: "Private IP address: %{ip}"
14
+ destroying: "Destroying the VM..."
15
+ powering_off: "Powering off the VM..."
16
+ powering_on: "Powering on the VM..."
17
+ rebuilding: "Rebuilding the VM..."
18
+ reloading: "Rebooting the VM..."
19
+ creating_user: "Creating user account: %{user}..."
20
+ modifying_sudo: "Modifying sudoers file to remove tty requirement..."
21
+ using_key: "Using existing SSH key: %{name}"
22
+ creating_key: "Creating new SSH key: %{name}..."
23
+ trying_rsync_install: "Rsync not found, attempting to install with yum..."
24
+ rsyncing: "Rsyncing folder: %{hostpath} => %{guestpath}..."
25
+ rsync_missing: "The rsync executable was not found in the current path."
26
+ config:
27
+ client_id: "Client ID is required"
28
+ api_key: "API key is required"
29
+ private_key: "SSH private key path is required"
30
+ public_key: "SSH public key not found: %{key}"
31
+ errors:
32
+ public_key: |-
33
+ There was an issue reading the public key at:
34
+
35
+ Path: %{path}
36
+
37
+ Please check the file's permissions.
38
+ api_status: |-
39
+ There was an issue with the request made to Abiquo API
40
+ API at:
41
+
42
+ Path: %{path}
43
+ Headers: %{headers}
44
+ Data: %{data}
45
+
46
+ The response status from the API was:
47
+
48
+ Status: %{status}
49
+ Response: %{response}
50
+ apifind_error: |-
51
+ There was an issue when looking for:
52
+ Entity: %{entity}
53
+ Name: %{name}
54
+
55
+ Probably doesn't exist. Please check through Abiquo UI
56
+ restclient_error: |-
57
+ There was an issue with the request made to Abiquo API at:
58
+ Path: %{path}
59
+ Headers: %{headers}
60
+ Data: %{data}
61
+
62
+ The response status from the API was:
63
+ Response: %{response}
64
+ rsync: |-
65
+ There was an error when attemping to rsync a share folder.
66
+ Please inspect the error message below for more info.
67
+
68
+ Host path: %{hostpath}
69
+ Guest path: %{guestpath}
70
+ Error: %{stderr}
71
+ json: |-
72
+ There was an issue with the JSON response from the Digital Ocean
73
+ API at:
74
+
75
+ Path: %{path}
76
+ URI Params: %{params}
77
+
78
+ The response JSON from the API was:
79
+
80
+ Response: %{response}
81
+ result_match: |-
82
+ The result collection for %{collection_name}:
83
+
84
+ %{sub_obj}
85
+
86
+ Contained no object with the value "%{value}" for the the
87
+ key "%{key}".
88
+
89
+ Please ensure that the configured value exists in the collection.
90
+ certificate: |-
91
+ The secure connection to the Digital Ocean API has failed. Please
92
+ ensure that your local certificates directory is defined in the
93
+ provider config.
94
+
95
+ config.vm.provider :digital_ocean do |vm|
96
+ vm.ca_path = "/path/to/ssl/ca/cert.crt"
97
+ end
98
+
99
+ This is generally caused by the OpenSSL configuration associated
100
+ with the Ruby install being unaware of the system specific ca
101
+ certs.
102
+ local_ip: |-
103
+ The Digital Ocean provider was unable to determine the host's IP.
@@ -0,0 +1,22 @@
1
+ Vagrant.require_plugin('vagrant-abiquo')
2
+
3
+ Vagrant.configure('2') do |config|
4
+ config.vm.provider :abiquo do |provider, override|
5
+ override.vm.box = 'abiquo'
6
+ override.vm.box_url = "https://github.com/danfaizer/vagrant-abiquo/raw/master/box/abiquo.box"
7
+ provider.api_user = ENV['ABIQUO_API_USER']
8
+ provider.api_password = ENV['ABIQUO_API_PASSWORD']
9
+ provider.api_uri = 'https://preproduction.bcn.abiquo.com/api'
10
+ end
11
+
12
+ config.vm.provision :shell, :path => 'scripts/provision.sh'
13
+
14
+ config.vm.define :virtualmachine do |virtualmachine|
15
+ virtualmachine.vm.provider :abiquo do |provider|
16
+ provider.datacenter = 'DC1'
17
+ provider.virtualdatacenter = 'vdc1'
18
+ provider.virtualappliance = 'vapp1'
19
+ provider.template = 'Core'
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ echo 'Testing 1 2 3!'
@@ -0,0 +1,11 @@
1
+
2
+ cd test
3
+
4
+ vagrant up --provider=abiquo
5
+ vagrant up
6
+ vagrant provision
7
+ vagrant rebuild
8
+ vagrant halt
9
+ vagrant destroy
10
+
11
+ cd ..
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'vagrant-abiquo/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "vagrant-abiquo"
8
+ gem.version = VagrantPlugins::Abiquo::VERSION
9
+ gem.authors = ["Daniel Beneyto"]
10
+ gem.email = ["daniel.beneyto@abiquo.com"]
11
+ gem.description = %q{Enables Vagrant to manage Abiquo instances}
12
+ gem.summary = gem.description
13
+
14
+ gem.files = `git ls-files`.split($/)
15
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
16
+ gem.require_paths = ["lib"]
17
+
18
+ gem.add_dependency "rest-client", ">= 1.6.7"
19
+ gem.add_dependency "json"
20
+ gem.add_dependency "log4r"
21
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-abiquo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Beneyto
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.6.7
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: log4r
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Enables Vagrant to manage Abiquo instances
56
+ email:
57
+ - daniel.beneyto@abiquo.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - CHANGELOG.md
63
+ - Gemfile
64
+ - Gemfile.lock
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - Vagrantfile
69
+ - box/abiquo.box
70
+ - box/metadata.json
71
+ - lib/vagrant-abiquo.rb
72
+ - lib/vagrant-abiquo/actions.rb
73
+ - lib/vagrant-abiquo/actions/check_state.rb
74
+ - lib/vagrant-abiquo/actions/create.rb
75
+ - lib/vagrant-abiquo/actions/destroy.rb
76
+ - lib/vagrant-abiquo/actions/modify_provision_path.rb
77
+ - lib/vagrant-abiquo/actions/power_off.rb
78
+ - lib/vagrant-abiquo/actions/power_on.rb
79
+ - lib/vagrant-abiquo/actions/reload.rb
80
+ - lib/vagrant-abiquo/config.rb
81
+ - lib/vagrant-abiquo/errors.rb
82
+ - lib/vagrant-abiquo/helpers/client.rb
83
+ - lib/vagrant-abiquo/helpers/result.rb
84
+ - lib/vagrant-abiquo/plugin.rb
85
+ - lib/vagrant-abiquo/provider.rb
86
+ - lib/vagrant-abiquo/version.rb
87
+ - locales/en.yml
88
+ - test/Vagrantfile
89
+ - test/scripts/provision.sh
90
+ - test/test.sh
91
+ - vagrant-abiquo.gemspec
92
+ homepage:
93
+ licenses: []
94
+ metadata: {}
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 2.0.15
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: Enables Vagrant to manage Abiquo instances
115
+ test_files:
116
+ - test/Vagrantfile
117
+ - test/scripts/provision.sh
118
+ - test/test.sh