vagrant-sakura 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 +19 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +102 -0
- data/Rakefile +3 -0
- data/dummy.box +0 -0
- data/example_box/Vagrantfile +8 -0
- data/example_box/metadata.json +3 -0
- data/lib/vagrant-sakura.rb +16 -0
- data/lib/vagrant-sakura/action.rb +158 -0
- data/lib/vagrant-sakura/action/connect_sakura.rb +23 -0
- data/lib/vagrant-sakura/action/delete_server.rb +39 -0
- data/lib/vagrant-sakura/action/halt.rb +31 -0
- data/lib/vagrant-sakura/action/is_created.rb +16 -0
- data/lib/vagrant-sakura/action/message_already_created.rb +16 -0
- data/lib/vagrant-sakura/action/message_down.rb +16 -0
- data/lib/vagrant-sakura/action/message_not_created.rb +16 -0
- data/lib/vagrant-sakura/action/message_will_not_destroy.rb +17 -0
- data/lib/vagrant-sakura/action/power_on.rb +23 -0
- data/lib/vagrant-sakura/action/read_ssh_info.rb +37 -0
- data/lib/vagrant-sakura/action/read_state.rb +35 -0
- data/lib/vagrant-sakura/action/reset.rb +24 -0
- data/lib/vagrant-sakura/action/run_instance.rb +143 -0
- data/lib/vagrant-sakura/command.rb +12 -0
- data/lib/vagrant-sakura/config.rb +98 -0
- data/lib/vagrant-sakura/driver/api.rb +77 -0
- data/lib/vagrant-sakura/driver/cert.pem +76 -0
- data/lib/vagrant-sakura/errors.rb +19 -0
- data/lib/vagrant-sakura/plugin.rb +53 -0
- data/lib/vagrant-sakura/provider.rb +31 -0
- data/lib/vagrant-sakura/version.rb +5 -0
- data/locales/en.yml +39 -0
- metadata +105 -0
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'net/https'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Sakura
|
6
|
+
module Driver
|
7
|
+
APIHOST = "secure.sakura.ad.jp"
|
8
|
+
APIPREFIX = "/cloud/api/cloud/1.0"
|
9
|
+
CERTFILE = File.expand_path("../cert.pem", __FILE__)
|
10
|
+
|
11
|
+
class API
|
12
|
+
def initialize(access_token, access_token_secret)
|
13
|
+
@logger = Log4r::Logger.new("vagrant::provider::sakura")
|
14
|
+
|
15
|
+
@access_token = access_token
|
16
|
+
@access_token_secret = access_token_secret
|
17
|
+
|
18
|
+
@https = Net::HTTP.new(APIHOST, 443)
|
19
|
+
@https.use_ssl = true
|
20
|
+
@https.ca_file = CERTFILE
|
21
|
+
@https.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
22
|
+
@https.verify_depth = 2
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete(resource, data = nil)
|
26
|
+
request = Net::HTTP::Delete.new(APIPREFIX + resource)
|
27
|
+
request.body = data.to_json if data
|
28
|
+
do_request request
|
29
|
+
end
|
30
|
+
|
31
|
+
def get(resource, data = nil)
|
32
|
+
request = Net::HTTP::Get.new(APIPREFIX + resource)
|
33
|
+
request.body = data.to_json if data
|
34
|
+
do_request request
|
35
|
+
end
|
36
|
+
|
37
|
+
def post(resource, data)
|
38
|
+
request = Net::HTTP::Post.new(APIPREFIX + resource)
|
39
|
+
request.body = data.to_json
|
40
|
+
do_request request
|
41
|
+
end
|
42
|
+
|
43
|
+
def put(resource, data = nil)
|
44
|
+
request = Net::HTTP::Put.new(APIPREFIX + resource)
|
45
|
+
request.body = if data then data.to_json else '' end
|
46
|
+
do_request request
|
47
|
+
end
|
48
|
+
|
49
|
+
def do_request(request)
|
50
|
+
request.basic_auth @access_token, @access_token_secret
|
51
|
+
response = @https.request(request)
|
52
|
+
@logger.debug("#{request.method} #{request.path} #{request.body} "+
|
53
|
+
"=> #{response.code} : #{response.body}")
|
54
|
+
|
55
|
+
emsg = "#{response.code} (#{request.method} #{request.path})"
|
56
|
+
case response.code
|
57
|
+
when /2../
|
58
|
+
# Success
|
59
|
+
when "404"
|
60
|
+
raise NotFoundError, emsg
|
61
|
+
when "409"
|
62
|
+
raise ConflictError, emsg
|
63
|
+
else
|
64
|
+
raise GenericError, emsg
|
65
|
+
end
|
66
|
+
|
67
|
+
JSON.parse response.body
|
68
|
+
end
|
69
|
+
private :do_request
|
70
|
+
end
|
71
|
+
|
72
|
+
class ConflictError < RuntimeError; end
|
73
|
+
class GenericError < RuntimeError; end
|
74
|
+
class NotFoundError < RuntimeError; end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
Certificate:
|
2
|
+
Data:
|
3
|
+
Version: 3 (0x2)
|
4
|
+
Serial Number: 0 (0x0)
|
5
|
+
Signature Algorithm: sha1WithRSAEncryption
|
6
|
+
Issuer: C=JP, O=SECOM Trust.net, OU=Security Communication RootCA1
|
7
|
+
Validity
|
8
|
+
Not Before: Sep 30 04:20:49 2003 GMT
|
9
|
+
Not After : Sep 30 04:20:49 2023 GMT
|
10
|
+
Subject: C=JP, O=SECOM Trust.net, OU=Security Communication RootCA1
|
11
|
+
Subject Public Key Info:
|
12
|
+
Public Key Algorithm: rsaEncryption
|
13
|
+
RSA Public Key: (2048 bit)
|
14
|
+
Modulus (2048 bit):
|
15
|
+
00:b3:b3:fe:7f:d3:6d:b1:ef:16:7c:57:a5:0c:6d:
|
16
|
+
76:8a:2f:4b:bf:64:fb:4c:ee:8a:f0:f3:29:7c:f5:
|
17
|
+
ff:ee:2a:e0:e9:e9:ba:5b:64:22:9a:9a:6f:2c:3a:
|
18
|
+
26:69:51:05:99:26:dc:d5:1c:6a:71:c6:9a:7d:1e:
|
19
|
+
9d:dd:7c:6c:c6:8c:67:67:4a:3e:f8:71:b0:19:27:
|
20
|
+
a9:09:0c:a6:95:bf:4b:8c:0c:fa:55:98:3b:d8:e8:
|
21
|
+
22:a1:4b:71:38:79:ac:97:92:69:b3:89:7e:ea:21:
|
22
|
+
68:06:98:14:96:87:d2:61:36:bc:6d:27:56:9e:57:
|
23
|
+
ee:c0:c0:56:fd:32:cf:a4:d9:8e:c2:23:d7:8d:a8:
|
24
|
+
f3:d8:25:ac:97:e4:70:38:f4:b6:3a:b4:9d:3b:97:
|
25
|
+
26:43:a3:a1:bc:49:59:72:4c:23:30:87:01:58:f6:
|
26
|
+
4e:be:1c:68:56:66:af:cd:41:5d:c8:b3:4d:2a:55:
|
27
|
+
46:ab:1f:da:1e:e2:40:3d:db:cd:7d:b9:92:80:9c:
|
28
|
+
37:dd:0c:96:64:9d:dc:22:f7:64:8b:df:61:de:15:
|
29
|
+
94:52:15:a0:7d:52:c9:4b:a8:21:c9:c6:b1:ed:cb:
|
30
|
+
c3:95:60:d1:0f:f0:ab:70:f8:df:cb:4d:7e:ec:d6:
|
31
|
+
fa:ab:d9:bd:7f:54:f2:a5:e9:79:fa:d9:d6:76:24:
|
32
|
+
28:73
|
33
|
+
Exponent: 65537 (0x10001)
|
34
|
+
X509v3 extensions:
|
35
|
+
X509v3 Subject Key Identifier:
|
36
|
+
A0:73:49:99:68:DC:85:5B:65:E3:9B:28:2F:57:9F:BD:33:BC:07:48
|
37
|
+
X509v3 Key Usage:
|
38
|
+
Certificate Sign, CRL Sign
|
39
|
+
X509v3 Basic Constraints: critical
|
40
|
+
CA:TRUE
|
41
|
+
Signature Algorithm: sha1WithRSAEncryption
|
42
|
+
68:40:a9:a8:bb:e4:4f:5d:79:b3:05:b5:17:b3:60:13:eb:c6:
|
43
|
+
92:5d:e0:d1:d3:6a:fe:fb:be:9b:6d:bf:c7:05:6d:59:20:c4:
|
44
|
+
1c:f0:b7:da:84:58:02:63:fa:48:16:ef:4f:a5:0b:f7:4a:98:
|
45
|
+
f2:3f:9e:1b:ad:47:6b:63:ce:08:47:eb:52:3f:78:9c:af:4d:
|
46
|
+
ae:f8:d5:4f:cf:9a:98:2a:10:41:39:52:c4:dd:d9:9b:0e:ef:
|
47
|
+
93:01:ae:b2:2e:ca:68:42:24:42:6c:b0:b3:3a:3e:cd:e9:da:
|
48
|
+
48:c4:15:cb:e9:f9:07:0f:92:50:49:8a:dd:31:97:5f:c9:e9:
|
49
|
+
37:aa:3b:59:65:97:94:32:c9:b3:9f:3e:3a:62:58:c5:49:ad:
|
50
|
+
62:0e:71:a5:32:aa:2f:c6:89:76:43:40:13:13:67:3d:a2:54:
|
51
|
+
25:10:cb:f1:3a:f2:d9:fa:db:49:56:bb:a6:fe:a7:41:35:c3:
|
52
|
+
e0:88:61:c9:88:c7:df:36:10:22:98:59:ea:b0:4a:fb:56:16:
|
53
|
+
73:6e:ac:4d:f7:22:a1:4f:ad:1d:7a:2d:45:27:e5:30:c1:5e:
|
54
|
+
f2:da:13:cb:25:42:51:95:47:03:8c:6c:21:cc:74:42:ed:53:
|
55
|
+
ff:33:8b:8f:0f:57:01:16:2f:cf:a6:ee:c9:70:22:14:bd:fd:
|
56
|
+
be:6c:0b:03
|
57
|
+
-----BEGIN CERTIFICATE-----
|
58
|
+
MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
|
59
|
+
MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
|
60
|
+
dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
|
61
|
+
WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
|
62
|
+
VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
|
63
|
+
DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
|
64
|
+
9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
|
65
|
+
DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
|
66
|
+
Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
|
67
|
+
QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
|
68
|
+
xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
|
69
|
+
A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
|
70
|
+
AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
|
71
|
+
kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
|
72
|
+
Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
|
73
|
+
Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
|
74
|
+
JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
|
75
|
+
RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
|
76
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "vagrant"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Sakura
|
5
|
+
module Errors
|
6
|
+
class VagrantSakuraError < Vagrant::Errors::VagrantError
|
7
|
+
error_namespace("vagrant_sakura.errors")
|
8
|
+
end
|
9
|
+
|
10
|
+
class InstanceReadyTimeout < VagrantSakuraError
|
11
|
+
error_key(:instance_ready_timeout)
|
12
|
+
end
|
13
|
+
|
14
|
+
class RsyncError < VagrantSakuraError
|
15
|
+
error_key(:rsync_error)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "log4r"
|
2
|
+
require "vagrant"
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Sakura
|
6
|
+
class Plugin < Vagrant.plugin("2")
|
7
|
+
name "Sakura"
|
8
|
+
description <<-DESC
|
9
|
+
This plugin installs a provider that allows Vagrant to manage
|
10
|
+
server instances in Sakura Cloud.
|
11
|
+
DESC
|
12
|
+
|
13
|
+
config(:sakura, :provider) do
|
14
|
+
require_relative "config"
|
15
|
+
Config
|
16
|
+
end
|
17
|
+
|
18
|
+
provider(:sakura) do
|
19
|
+
setup_i18n
|
20
|
+
setup_logging
|
21
|
+
|
22
|
+
require_relative "provider"
|
23
|
+
Provider
|
24
|
+
end
|
25
|
+
|
26
|
+
# command(:'sakura-plans') do
|
27
|
+
# require_relative "command"
|
28
|
+
# Command
|
29
|
+
# end
|
30
|
+
|
31
|
+
def self.setup_i18n
|
32
|
+
I18n.load_path << File.expand_path("locales/en.yml", Sakura.source_root)
|
33
|
+
I18n.reload!
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.setup_logging
|
37
|
+
level = nil
|
38
|
+
begin
|
39
|
+
level = Log4r.const_get(ENV["VAGRANT_LOG"].upcase)
|
40
|
+
level = nil if !level.is_a?(Integer)
|
41
|
+
rescue NameError
|
42
|
+
end
|
43
|
+
|
44
|
+
if level
|
45
|
+
logger = Log4r::Logger.new("vagrant_sakura")
|
46
|
+
logger.outputters = Log4r::Outputter.stderr
|
47
|
+
logger.level = level
|
48
|
+
logger = nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "log4r"
|
2
|
+
require "vagrant"
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Sakura
|
6
|
+
class Provider < Vagrant.plugin("2", :provider)
|
7
|
+
def initialize(machine)
|
8
|
+
@machine = machine
|
9
|
+
end
|
10
|
+
|
11
|
+
def action(name)
|
12
|
+
action_method = "action_#{name}"
|
13
|
+
return Action.send(action_method) if Action.respond_to?(action_method)
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def ssh_info
|
18
|
+
env = @machine.action("read_ssh_info")
|
19
|
+
env[:machine_ssh_info]
|
20
|
+
end
|
21
|
+
|
22
|
+
def state
|
23
|
+
env = @machine.action("read_state")
|
24
|
+
state_id = env[:machine_state_id]
|
25
|
+
short = state_id.to_s
|
26
|
+
long = I18n.t("vagrant_sakura.state_#{short}")
|
27
|
+
Vagrant::MachineState.new(state_id.to_sym, short, long)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/locales/en.yml
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
en:
|
2
|
+
vagrant_sakura:
|
3
|
+
already_created: |-
|
4
|
+
The server is already created.
|
5
|
+
creating_instance: |-
|
6
|
+
Creating a server with the following settings...
|
7
|
+
down: |-
|
8
|
+
The server is down.
|
9
|
+
not_created: |-
|
10
|
+
Server is not created. Please run `vagrant up` first.
|
11
|
+
power_off: |-
|
12
|
+
Turning off power...
|
13
|
+
power_on: |-
|
14
|
+
Turning on power.
|
15
|
+
ready: |-
|
16
|
+
Server is booted and ready for use!
|
17
|
+
reset: |-
|
18
|
+
The server was reloaded.
|
19
|
+
state_cleaning: |-
|
20
|
+
The server is terminated and cleaning up.
|
21
|
+
state_down: |-
|
22
|
+
The server is down.
|
23
|
+
state_not_created: |-
|
24
|
+
The server has not been created yet, or destroyed.
|
25
|
+
state_up: |-
|
26
|
+
The server is up and running.
|
27
|
+
terminating: |-
|
28
|
+
Terminating the server...
|
29
|
+
will_not_destroy: |-
|
30
|
+
The server '%{name}' will not be destroyed, since the confirmation
|
31
|
+
was declined.
|
32
|
+
waiting_for_ssh: |-
|
33
|
+
Waiting for SSH to become available...
|
34
|
+
|
35
|
+
config:
|
36
|
+
access_token_required: |-
|
37
|
+
An access token is required via "access_token"
|
38
|
+
access_token_secret_required: |-
|
39
|
+
An access token secret is required via "access_token_secret"
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vagrant-sakura
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tomoyuki Sahara
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Enables Vagrant to manage machines in Sakura Cloud.
|
42
|
+
email:
|
43
|
+
- sahara@surt.net
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- CHANGELOG.md
|
50
|
+
- Gemfile
|
51
|
+
- LICENSE.txt
|
52
|
+
- README.md
|
53
|
+
- Rakefile
|
54
|
+
- dummy.box
|
55
|
+
- example_box/Vagrantfile
|
56
|
+
- example_box/metadata.json
|
57
|
+
- lib/vagrant-sakura.rb
|
58
|
+
- lib/vagrant-sakura/action.rb
|
59
|
+
- lib/vagrant-sakura/action/connect_sakura.rb
|
60
|
+
- lib/vagrant-sakura/action/delete_server.rb
|
61
|
+
- lib/vagrant-sakura/action/halt.rb
|
62
|
+
- lib/vagrant-sakura/action/is_created.rb
|
63
|
+
- lib/vagrant-sakura/action/message_already_created.rb
|
64
|
+
- lib/vagrant-sakura/action/message_down.rb
|
65
|
+
- lib/vagrant-sakura/action/message_not_created.rb
|
66
|
+
- lib/vagrant-sakura/action/message_will_not_destroy.rb
|
67
|
+
- lib/vagrant-sakura/action/power_on.rb
|
68
|
+
- lib/vagrant-sakura/action/read_ssh_info.rb
|
69
|
+
- lib/vagrant-sakura/action/read_state.rb
|
70
|
+
- lib/vagrant-sakura/action/reset.rb
|
71
|
+
- lib/vagrant-sakura/action/run_instance.rb
|
72
|
+
- lib/vagrant-sakura/command.rb
|
73
|
+
- lib/vagrant-sakura/config.rb
|
74
|
+
- lib/vagrant-sakura/driver/api.rb
|
75
|
+
- lib/vagrant-sakura/driver/cert.pem
|
76
|
+
- lib/vagrant-sakura/errors.rb
|
77
|
+
- lib/vagrant-sakura/plugin.rb
|
78
|
+
- lib/vagrant-sakura/provider.rb
|
79
|
+
- lib/vagrant-sakura/version.rb
|
80
|
+
- locales/en.yml
|
81
|
+
homepage: ''
|
82
|
+
licenses:
|
83
|
+
- MIT
|
84
|
+
metadata: {}
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
requirements: []
|
100
|
+
rubyforge_project:
|
101
|
+
rubygems_version: 2.0.3
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: Enables Vagrant to manage machines in Sakura Cloud.
|
105
|
+
test_files: []
|