acapi 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/README.md +98 -0
- data/Rakefile +1 -0
- data/acapi.gemspec +25 -0
- data/cloudapi.acquia.com.pem +124 -0
- data/lib/acapi.rb +9 -0
- data/lib/acapi/client.rb +70 -0
- data/lib/acapi/client/databases.rb +85 -0
- data/lib/acapi/client/deployments.rb +16 -0
- data/lib/acapi/client/domains.rb +39 -0
- data/lib/acapi/client/files.rb +11 -0
- data/lib/acapi/client/keys.rb +27 -0
- data/lib/acapi/client/servers.rb +28 -0
- data/lib/acapi/client/sites.rb +28 -0
- data/lib/acapi/client/tasks.rb +43 -0
- data/lib/acapi/default.rb +16 -0
- data/lib/acapi/version.rb +3 -0
- metadata +120 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
# Acquia API gem
|
2
|
+
|
3
|
+
Ruby implementation of the Acquia Cloud API.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'acquia-api'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install acquia-api
|
18
|
+
|
19
|
+
## Example Usage
|
20
|
+
|
21
|
+
We're going to assume we're testing a production deploy of tag
|
22
|
+
`release-34` by deploying to the `test` environment, since we'd want to
|
23
|
+
do this before running through a similar process on `prod` itself.
|
24
|
+
|
25
|
+
```rb
|
26
|
+
require 'acapi'
|
27
|
+
|
28
|
+
# Site/subscription will be auto-detected from credentials.
|
29
|
+
client = AcquiaCloudApi::Client.new(
|
30
|
+
:username => '39513c57-364a-3d2f-4e6a-654d5a793535',
|
31
|
+
:password => 'Vah6ewCG0zn0IiQ8ylLyv8rRFZ2vZyAysOSguHkk1mfl9GQuEK3x'
|
32
|
+
)
|
33
|
+
|
34
|
+
client.add_domain 'staging.example.com', :test
|
35
|
+
client.copy_files! :prod, :test
|
36
|
+
|
37
|
+
# Collect response data from methods for later use.
|
38
|
+
responses = []
|
39
|
+
responses << client.copy_database! 'my_database', :prod, :test
|
40
|
+
responses << client.deploy! 'release-34', :test
|
41
|
+
|
42
|
+
# Output status of tasks for fun.
|
43
|
+
#
|
44
|
+
# SAMPLE OUTPUT
|
45
|
+
# code-push task status: done
|
46
|
+
# db-migrate task status: done
|
47
|
+
responses.each do |res|
|
48
|
+
puts "#{res['queue']} task status: #{client.task_status res['id']}"
|
49
|
+
end
|
50
|
+
|
51
|
+
# Wait for db copy and deploy tasks to complete.
|
52
|
+
responses.each do |res|
|
53
|
+
client.poll_task res['id']
|
54
|
+
end
|
55
|
+
```
|
56
|
+
|
57
|
+
### Auto-polling methods
|
58
|
+
|
59
|
+
If you would rather have certain methods automatically wait for their
|
60
|
+
respective tasks to complete before moving on, paste this into the top
|
61
|
+
of your code. (You'll likely want to add more functions than
|
62
|
+
`:create_database`.)
|
63
|
+
|
64
|
+
```rb
|
65
|
+
require 'acapi'
|
66
|
+
|
67
|
+
module AcquiaCloudApi
|
68
|
+
class Client
|
69
|
+
|
70
|
+
[
|
71
|
+
:create_database!
|
72
|
+
].each do |method|
|
73
|
+
alias_method "original_#{method}".to_sym, method.to_sym
|
74
|
+
|
75
|
+
define_method method.to_sym do |*args|
|
76
|
+
response = self.send("original_#{method}".to_sym, *args)
|
77
|
+
task_id = response['id']
|
78
|
+
poll_task(task_id)
|
79
|
+
|
80
|
+
original_reponse = response
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Client#create_database will now wait for database creation task to complete.
|
88
|
+
client.create_database! 'testing123'
|
89
|
+
|
90
|
+
```
|
91
|
+
|
92
|
+
## Contributing
|
93
|
+
|
94
|
+
1. Fork it
|
95
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
96
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
97
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
98
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/acapi.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'acapi/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "acapi"
|
8
|
+
spec.version = AcquiaCloudApi::VERSION
|
9
|
+
spec.authors = ["Sam Boyer", "Patrick Connolly"]
|
10
|
+
spec.email = ["tech@samboyer.org", "patrick@myplanetdigital.com"]
|
11
|
+
spec.description = %q{Ruby implementation of the Acquia Cloud API.}
|
12
|
+
spec.summary = %q{Ruby implementation of the Acquia Cloud API.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "rest-client"
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIGKjCCBRKgAwIBAgIQDKbJFrxPR0qGgrQIFT5AGDANBgkqhkiG9w0BAQUFADBm
|
3
|
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
4
|
+
d3cuZGlnaWNlcnQuY29tMSUwIwYDVQQDExxEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
|
5
|
+
ZSBDQS0zMB4XDTA5MDcwMTAwMDAwMFoXDTEyMDgyOTIzNTk1OVowZDELMAkGA1UE
|
6
|
+
BhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxEDAOBgNVBAcTB0FuZG92ZXIx
|
7
|
+
FDASBgNVBAoTC0FjcXVpYSBJbmMuMRUwEwYDVQQDFAwqLmFjcXVpYS5jb20wgZ8w
|
8
|
+
DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANvhvZdziP2KMwyKxDMo9fzz9dm8xdKc
|
9
|
+
bMVaLaZ4YUwunqfDDSv6JPEo9VOAGEMY5a2kltvzfzrhvKfNLIUtfKV8e2VPtD9x
|
10
|
+
Z5afXN/MPa88MrMM1nZWZAwqDtX+zZHnYZU7rfbPeWzq08omYMKWClFUiO/ImtB0
|
11
|
+
ztQx/VfYLV7BAgMBAAGjggNYMIIDVDAfBgNVHSMEGDAWgBRQ6nOJ2yn7EI+e5QEg
|
12
|
+
1N55mUiD9zAdBgNVHQ4EFgQUn8k/8BAF6I6mRY/Z+kTvoqmhcjAwIwYDVR0RBBww
|
13
|
+
GoIMKi5hY3F1aWEuY29tggphY3F1aWEuY29tMH8GCCsGAQUFBwEBBHMwcTAkBggr
|
14
|
+
BgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEkGCCsGAQUFBzAChj1o
|
15
|
+
dHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DQUNlcnRzL0RpZ2lDZXJ0SGlnaEFzc3Vy
|
16
|
+
YW5jZUNBLTMuY3J0MA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMGUGA1Ud
|
17
|
+
HwReMFwwLKAqoCiGJmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9jYTMtMjAwOWQu
|
18
|
+
Y3JsMCygKqAohiZodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vY2EzLTIwMDlkLmNy
|
19
|
+
bDCCAcYGA1UdIASCAb0wggG5MIIBtQYLYIZIAYb9bAEDAAEwggGkMDoGCCsGAQUF
|
20
|
+
BwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnku
|
21
|
+
aHRtMIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAA
|
22
|
+
dABoAGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQA
|
23
|
+
dQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQA
|
24
|
+
aQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIA
|
25
|
+
ZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcA
|
26
|
+
aABpAGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQA
|
27
|
+
IABhAHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4A
|
28
|
+
IABiAHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMB0GA1UdJQQWMBQGCCsGAQUFBwMB
|
29
|
+
BggrBgEFBQcDAjANBgkqhkiG9w0BAQUFAAOCAQEAmwaOT3xeJYHBxcUt8Txey4kg
|
30
|
+
9y50R71stysQAL/NVUJ5fb43IRt1eQN1deQmM8vUcBb+G7SRM1EaET0RRKno/YOc
|
31
|
+
rRpx9jeC98lnZ1KaT9BCNrIEAQeVDORURioswb0JUQl0kyWO2e63aTsK+1yuBtUQ
|
32
|
+
nqIyAIzQ4qcGDFWRzTB3U3b0EFCCwTKws2xzK9UF1oIuNz0ypRDFrYFRTxO4tcwN
|
33
|
+
wOe+7yieZkEkT73f0k4YXr7ok8APYk0S21YqwTOKQl5SaemtbTtsMUNCn1EFqE+b
|
34
|
+
kp8MJq1HYf6L3DxvJMgVi+1hj1Ccpl5Xche8Uhk2fBKbv0jDk1NsFY0bAifaZA==
|
35
|
+
-----END CERTIFICATE-----
|
36
|
+
-----BEGIN CERTIFICATE-----
|
37
|
+
MIIGVTCCBT2gAwIBAgIQCFH5WYFBRcq94CTiEsnCDjANBgkqhkiG9w0BAQUFADBs
|
38
|
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
39
|
+
d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
|
40
|
+
ZSBFViBSb290IENBMB4XDTA3MDQwMzAwMDAwMFoXDTIyMDQwMzAwMDAwMFowZjEL
|
41
|
+
MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
|
42
|
+
LmRpZ2ljZXJ0LmNvbTElMCMGA1UEAxMcRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
|
43
|
+
Q0EtMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9hCikQH17+NDdR
|
44
|
+
CPge+yLtYb4LDXBMUGMmdRW5QYiXtvCgFbsIYOBC6AUpEIc2iihlqO8xB3RtNpcv
|
45
|
+
KEZmBMcqeSZ6mdWOw21PoF6tvD2Rwll7XjZswFPPAAgyPhBkWBATaccM7pxCUQD5
|
46
|
+
BUTuJM56H+2MEb0SqPMV9Bx6MWkBG6fmXcCabH4JnudSREoQOiPkm7YDr6ictFuf
|
47
|
+
1EutkozOtREqqjcYjbTCuNhcBoz4/yO9NV7UfD5+gw6RlgWYw7If48hl66l7XaAs
|
48
|
+
zPw82W3tzPpLQ4zJ1LilYRyyQLYoEt+5+F/+07LJ7z20Hkt8HEyZNp496+ynaF4d
|
49
|
+
32duXvsCAwEAAaOCAvcwggLzMA4GA1UdDwEB/wQEAwIBhjCCAcYGA1UdIASCAb0w
|
50
|
+
ggG5MIIBtQYLYIZIAYb9bAEDAAIwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3
|
51
|
+
LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUH
|
52
|
+
AgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQBy
|
53
|
+
AHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBj
|
54
|
+
AGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAg
|
55
|
+
AEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQ
|
56
|
+
AGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBt
|
57
|
+
AGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBj
|
58
|
+
AG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBl
|
59
|
+
AHIAZQBuAGMAZQAuMA8GA1UdEwEB/wQFMAMBAf8wNAYIKwYBBQUHAQEEKDAmMCQG
|
60
|
+
CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wgY8GA1UdHwSBhzCB
|
61
|
+
hDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGlnaEFz
|
62
|
+
c3VyYW5jZUVWUm9vdENBLmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQu
|
63
|
+
Y29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDAfBgNVHSMEGDAW
|
64
|
+
gBSxPsNpA/i/RwHUmCYaCALvY2QrwzAdBgNVHQ4EFgQUUOpzidsp+xCPnuUBINTe
|
65
|
+
eZlIg/cwDQYJKoZIhvcNAQEFBQADggEBAF1PhPGoiNOjsrycbeUpSXfh59bcqdg1
|
66
|
+
rslx3OXb3J0kIZCmz7cBHJvUV5eR13UWpRLXuT0uiT05aYrWNTf58SHEW0CtWakv
|
67
|
+
XzoAKUMncQPkvTAyVab+hA4LmzgZLEN8rEO/dTHlIxxFVbdpCJG1z9fVsV7un5Tk
|
68
|
+
1nq5GMO41lJjHBC6iy9tXcwFOPRWBW3vnuzoYTYMFEuFFFoMg08iXFnLjIpx2vrF
|
69
|
+
EIRYzwfu45DC9fkpx1ojcflZtGQriLCnNseaIGHr+k61rmsb5OPs4tk8QUmoIKRU
|
70
|
+
9ZKNu8BVIASm2LAXFszj0Mi0PeXZhMbT9m5teMl5Q+h6N/9cNUm/ocU=
|
71
|
+
-----END CERTIFICATE-----
|
72
|
+
-----BEGIN CERTIFICATE-----
|
73
|
+
MIIEQjCCA6ugAwIBAgIEQodApTANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
|
74
|
+
VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
|
75
|
+
ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
|
76
|
+
KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
|
77
|
+
ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEw
|
78
|
+
MDEwNTAwMDBaFw0xNDA3MjYxODE1MTVaMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
|
79
|
+
EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNV
|
80
|
+
BAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwggEiMA0GCSqG
|
81
|
+
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGzOVz5vvUu+UtLTKm3+WBP8nNJUm2cSrD
|
82
|
+
1ZQ0Z6IKHLBfaaZAscS3so/QmKSpQVk609yU1jzbdDikSsxNJYL3SqVTEjju80lt
|
83
|
+
cZF+Y7arpl/DpIT4T2JRvvjF7Ns4kuMG5QiRDMQoQVX7y1qJFX5x6DW/TXIJPb46
|
84
|
+
OFBbdzEbjbPHJEWap6xtABRaBLe6E+tRCphBQSJOZWGHgUFQpnlcid4ZSlfVLuZd
|
85
|
+
HFMsfpjNGgYWpGhz0DQEE1yhcdNafFXbXmThN4cwVgTlEbQpgBLxeTmIogIRfCdm
|
86
|
+
t4i3ePLKCqg4qwpkwr9mXZWEwaElHoddGlALIBLMQbtuC1E4uEvLAgMBAAGjggET
|
87
|
+
MIIBDzASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggr
|
88
|
+
BgEFBQcDAgYIKwYBBQUHAwQwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdo
|
89
|
+
dHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v
|
90
|
+
Y3JsLmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMB0GA1UdDgQWBBSxPsNpA/i/RwHU
|
91
|
+
mCYaCALvY2QrwzALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7
|
92
|
+
UISX8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEF
|
93
|
+
BQADgYEASA4rbyBiTCiToyQ9WKshz4D4mpeQaiLtWnxHNpnneYR1qySPkgrVYQSu
|
94
|
+
w2pcsszZ5ESHb9uPOGL3RDadurxuB8TUjegf0Qtgo7WczmO+7Wfc+Lrebskly1u1
|
95
|
+
nXZwC99CcvhPQRFkpdLq/NWvEfQVOGecIKhLd1qRMkIy54Wz3zY=
|
96
|
+
-----END CERTIFICATE-----
|
97
|
+
-----BEGIN CERTIFICATE-----
|
98
|
+
MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
|
99
|
+
VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
|
100
|
+
ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
|
101
|
+
KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
|
102
|
+
ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
|
103
|
+
MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
|
104
|
+
ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
|
105
|
+
b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
|
106
|
+
bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
|
107
|
+
U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
|
108
|
+
A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
|
109
|
+
I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
|
110
|
+
wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
|
111
|
+
AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
|
112
|
+
oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
|
113
|
+
BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
|
114
|
+
dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
|
115
|
+
MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
|
116
|
+
b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
|
117
|
+
dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
|
118
|
+
MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
|
119
|
+
E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
|
120
|
+
MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
|
121
|
+
hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
|
122
|
+
95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
|
123
|
+
2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
|
124
|
+
-----END CERTIFICATE-----
|
data/lib/acapi.rb
ADDED
data/lib/acapi/client.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'rest_client'
|
3
|
+
require 'acapi/default'
|
4
|
+
require 'acapi/client/databases'
|
5
|
+
require 'acapi/client/deployments'
|
6
|
+
require 'acapi/client/domains'
|
7
|
+
require 'acapi/client/files'
|
8
|
+
require 'acapi/client/keys'
|
9
|
+
require 'acapi/client/servers'
|
10
|
+
require 'acapi/client/sites'
|
11
|
+
require 'acapi/client/tasks'
|
12
|
+
|
13
|
+
module AcquiaCloudApi
|
14
|
+
class Client
|
15
|
+
include AcquiaCloudApi::Client::Databases
|
16
|
+
include AcquiaCloudApi::Client::Deployments
|
17
|
+
include AcquiaCloudApi::Client::Domains
|
18
|
+
include AcquiaCloudApi::Client::Files
|
19
|
+
include AcquiaCloudApi::Client::Keys
|
20
|
+
include AcquiaCloudApi::Client::Servers
|
21
|
+
include AcquiaCloudApi::Client::Sites
|
22
|
+
include AcquiaCloudApi::Client::Tasks
|
23
|
+
|
24
|
+
def initialize(options = {})
|
25
|
+
@options = options
|
26
|
+
@site_name = options[:site_name]
|
27
|
+
@last_response = false
|
28
|
+
end
|
29
|
+
|
30
|
+
def get(uri, params = {})
|
31
|
+
request :get, uri, params
|
32
|
+
end
|
33
|
+
|
34
|
+
def post(uri, params = {}, data = {})
|
35
|
+
request :post, uri, params, data
|
36
|
+
end
|
37
|
+
|
38
|
+
def delete(uri, params = {})
|
39
|
+
request :delete, uri, params
|
40
|
+
end
|
41
|
+
|
42
|
+
def site_name
|
43
|
+
@site_name ||= Client.new(@options).sites.first.split(':').last
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def request(method, uri, params = {}, data = {})
|
49
|
+
cert = OpenSSL::X509::Certificate.new(File.read("#{AcquiaCloudApi.source_root}/cloudapi.acquia.com.pem"))
|
50
|
+
|
51
|
+
req = RestClient::Request.new(
|
52
|
+
:method => method,
|
53
|
+
:url => "#{Default::API_ENDPOINT}/#{uri}.json",
|
54
|
+
:user => @options[:username],
|
55
|
+
:password => @options[:password],
|
56
|
+
:payload => data,
|
57
|
+
:ssl_client_cert => cert,
|
58
|
+
:headers => {
|
59
|
+
:params => params
|
60
|
+
}
|
61
|
+
)
|
62
|
+
|
63
|
+
res = req.execute
|
64
|
+
@last_response = res
|
65
|
+
|
66
|
+
JSON.parse(res)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module AcquiaCloudApi
|
2
|
+
class Client
|
3
|
+
module Databases
|
4
|
+
|
5
|
+
def databases(env=nil, db_clusters=nil)
|
6
|
+
if env
|
7
|
+
# db instances
|
8
|
+
db_cluster_array = db_clusters.split if db_clusters.is_a? String
|
9
|
+
|
10
|
+
params = {:db_cluster => db_cluster_array} unless db_clusters.nil?
|
11
|
+
|
12
|
+
get "sites/#{site_name}/envs/#{env}/dbs", params
|
13
|
+
else
|
14
|
+
# db records
|
15
|
+
get "sites/#{site_name}/dbs"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
alias :list_databases :databases
|
19
|
+
|
20
|
+
def database(db_name, env=nil)
|
21
|
+
if env
|
22
|
+
# db instances
|
23
|
+
get "sites/#{site_name}/envs/#{env}/dbs/#{db_name}"
|
24
|
+
else
|
25
|
+
# db records
|
26
|
+
get "sites/#{site_name}/dbs/#{db_name}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def copy_database!(db_name, from_env, to_env)
|
31
|
+
post "sites/#{site_name}/dbs/#{db_name}/db-copy/#{from_env}/#{to_env}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_database(db_name)
|
35
|
+
params = {}
|
36
|
+
data = {:db => db_name}.to_json
|
37
|
+
|
38
|
+
post "sites/#{site_name}/dbs", params, data
|
39
|
+
end
|
40
|
+
|
41
|
+
def delete_database!(db_name, backup=true)
|
42
|
+
params = {:backup => backup ? 1 : 0}
|
43
|
+
|
44
|
+
delete "sites/#{site_name}/dbs/#{db_name}", params
|
45
|
+
end
|
46
|
+
|
47
|
+
def database_backups(db_name, env=nil)
|
48
|
+
get "sites/#{site_name}/envs/#{env}/dbs/#{db_name}/backups"
|
49
|
+
end
|
50
|
+
alias :list_backups :database_backups
|
51
|
+
alias :backups :database_backups
|
52
|
+
|
53
|
+
def create_database_backup(db_name, env=nil)
|
54
|
+
post "sites/#{site_name}/envs/#{env}/dbs/#{db_name}/backups"
|
55
|
+
end
|
56
|
+
alias :create_backup :create_database_backup
|
57
|
+
|
58
|
+
def database_backup(backup_id, db_name, env=nil)
|
59
|
+
get "sites/#{site_name}/envs/#{env}/dbs/#{db_name}/backups/#{backup_id}"
|
60
|
+
end
|
61
|
+
alias :backup :database_backup
|
62
|
+
|
63
|
+
def download_database_backup(backup_id, db_name, env=nil)
|
64
|
+
# TODO: Not working. Likely need to fix #get method so that doesn't try
|
65
|
+
# to parse response as JSON
|
66
|
+
get "sites/#{site_name}/envs/#{env}/dbs/#{db_name}/backups/#{backup_id}/download"
|
67
|
+
end
|
68
|
+
alias :download_backup :download_database_backup
|
69
|
+
|
70
|
+
def download_database_backup_link(backup_id, db_name, env=nil)
|
71
|
+
res = database_backup(backup_id, db_name, env)
|
72
|
+
download_link = res['link']
|
73
|
+
|
74
|
+
download_link
|
75
|
+
end
|
76
|
+
alias :download_backup_link :download_database_backup_link
|
77
|
+
|
78
|
+
def restore_database_backup!(backup_id, db_name, env=nil)
|
79
|
+
post "sites/#{site_name}/envs/#{env}/dbs/#{db_name}/backups/#{backup_id}/restore"
|
80
|
+
end
|
81
|
+
alias :restore_backup! :restore_database_backup!
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module AcquiaCloudApi
|
2
|
+
class Client
|
3
|
+
module Deployments
|
4
|
+
|
5
|
+
def deploy_reference!(git_ref, to_env)
|
6
|
+
params = {
|
7
|
+
:path => git_ref
|
8
|
+
}
|
9
|
+
post "sites/#{site_name}/envs/#{to_env}/code-deploy", params
|
10
|
+
end
|
11
|
+
alias :deploy! :deploy_reference!
|
12
|
+
alias :deploy_ref! :deploy_reference!
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module AcquiaCloudApi
|
2
|
+
class Client
|
3
|
+
module Domains
|
4
|
+
|
5
|
+
def domains(env)
|
6
|
+
get "sites/#{site_name}/envs/#{env}/domains"
|
7
|
+
end
|
8
|
+
alias :list_domains :domains
|
9
|
+
|
10
|
+
def domain(domain, env)
|
11
|
+
get "sites/#{site_name}/envs/#{env}/domains/#{domain}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_domain(domain, env)
|
15
|
+
post "/sites/#{site_name}/envs/#{env}/domains/#{domain}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def remove_domain(domain, env)
|
19
|
+
delete "sites/#{site_name}/envs/#{env}/domains/#{domain}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def purge_varnish_cache(domain, env)
|
23
|
+
delete "sites/#{site_name}/envs/#{env}/domains/#{domain}/cache"
|
24
|
+
end
|
25
|
+
alias :purge_varnish :purge_varnish_cache
|
26
|
+
alias :purge_cache :purge_varnish_cache
|
27
|
+
|
28
|
+
def migrate_domains(domains, from_env, to_env)
|
29
|
+
domains = domains.split if domains.is_a? String
|
30
|
+
|
31
|
+
params = {}
|
32
|
+
data = {:domains => domains}.to_json
|
33
|
+
|
34
|
+
post "sites/#{site_name}/domain-move/#{from_env}/#{to_env}", params, data
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module AcquiaCloudApi
|
2
|
+
class Client
|
3
|
+
module Keys
|
4
|
+
|
5
|
+
def keys
|
6
|
+
get "sites/#{site_name}/sshkeys"
|
7
|
+
end
|
8
|
+
alias :list_keys :keys
|
9
|
+
|
10
|
+
def key(key_id)
|
11
|
+
get "sites/#{site_name}/sshkeys/#{key_id}"
|
12
|
+
end
|
13
|
+
alias :user_key :key
|
14
|
+
|
15
|
+
def remove_key(key_id)
|
16
|
+
delete "sites/#{site_name}/sshkeys/#{key_id}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_key(nickname, pub_key_contents)
|
20
|
+
params = {:nickname => nickname}
|
21
|
+
data = {:ssh_pub_key => pub_key_contents}.to_json
|
22
|
+
|
23
|
+
post "sites/#{site_name}/sshkeys", params, data
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module AcquiaCloudApi
|
2
|
+
class Client
|
3
|
+
module Servers
|
4
|
+
|
5
|
+
def servers(env)
|
6
|
+
get "sites/#{site_name}/envs/#{env}/servers"
|
7
|
+
end
|
8
|
+
alias :list_servers :servers
|
9
|
+
|
10
|
+
def server(server_name, env)
|
11
|
+
get "sites/#{site_name}/envs/#{env}/servers/#{server_name}"
|
12
|
+
end
|
13
|
+
|
14
|
+
# TODO: Fix this (https://twitter.com/patconnolly/status/373203055677689857)
|
15
|
+
def php_procs(server_name, env, memory_limits = [], apc_shm = [])
|
16
|
+
memory_limits = memory_limits.split(',') if memory_limits.is_a? String
|
17
|
+
apc_shm = apc_shm.split(',') if apc_shm.is_a? String
|
18
|
+
|
19
|
+
params = {
|
20
|
+
:memory_limits => memory_limits,
|
21
|
+
:apc_shm => apc_shm
|
22
|
+
}
|
23
|
+
get "sites/#{site_name}/envs/#{env}/servers/#{server_name}/php-procs", params
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module AcquiaCloudApi
|
2
|
+
class Client
|
3
|
+
module Sites
|
4
|
+
|
5
|
+
def sites
|
6
|
+
get "sites"
|
7
|
+
end
|
8
|
+
alias :list_sites :sites
|
9
|
+
|
10
|
+
def site(name = site_name)
|
11
|
+
get "sites/#{name}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def environments(name = site_name)
|
15
|
+
get "sites/#{name}/envs"
|
16
|
+
end
|
17
|
+
alias :list_environments :environments
|
18
|
+
alias :list_envs :environments
|
19
|
+
alias :envs :environments
|
20
|
+
|
21
|
+
def environment(env = :dev, name = site_name)
|
22
|
+
get "sites/#{name}/envs/#{env}"
|
23
|
+
end
|
24
|
+
alias :env :environment
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module AcquiaCloudApi
|
2
|
+
class Client
|
3
|
+
module Tasks
|
4
|
+
|
5
|
+
def tasks
|
6
|
+
get "sites/#{site_name}/tasks"
|
7
|
+
end
|
8
|
+
alias :list_tasks :tasks
|
9
|
+
|
10
|
+
def task(task_id)
|
11
|
+
get "sites/#{site_name}/tasks/#{task_id}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def task_status(task_id)
|
15
|
+
res = task(task_id)
|
16
|
+
|
17
|
+
res['state']
|
18
|
+
end
|
19
|
+
|
20
|
+
def task_complete?(task_id)
|
21
|
+
task_status(task_id) == "done"
|
22
|
+
end
|
23
|
+
alias :task_done? :task_complete?
|
24
|
+
|
25
|
+
def poll_task(task_id)
|
26
|
+
time = 0
|
27
|
+
delay = 4
|
28
|
+
max = 120
|
29
|
+
|
30
|
+
until task_complete?(task_id)
|
31
|
+
sleep(delay)
|
32
|
+
time += delay
|
33
|
+
|
34
|
+
raise if time > max
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def poll_all
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
metadata
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: acapi
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Sam Boyer
|
9
|
+
- Patrick Connolly
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-09-09 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rest-client
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: bundler
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ~>
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '1.3'
|
39
|
+
type: :development
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.3'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
description: Ruby implementation of the Acquia Cloud API.
|
64
|
+
email:
|
65
|
+
- tech@samboyer.org
|
66
|
+
- patrick@myplanetdigital.com
|
67
|
+
executables: []
|
68
|
+
extensions: []
|
69
|
+
extra_rdoc_files: []
|
70
|
+
files:
|
71
|
+
- .gitignore
|
72
|
+
- Gemfile
|
73
|
+
- README.md
|
74
|
+
- Rakefile
|
75
|
+
- acapi.gemspec
|
76
|
+
- cloudapi.acquia.com.pem
|
77
|
+
- lib/acapi.rb
|
78
|
+
- lib/acapi/client.rb
|
79
|
+
- lib/acapi/client/databases.rb
|
80
|
+
- lib/acapi/client/deployments.rb
|
81
|
+
- lib/acapi/client/domains.rb
|
82
|
+
- lib/acapi/client/files.rb
|
83
|
+
- lib/acapi/client/keys.rb
|
84
|
+
- lib/acapi/client/servers.rb
|
85
|
+
- lib/acapi/client/sites.rb
|
86
|
+
- lib/acapi/client/tasks.rb
|
87
|
+
- lib/acapi/default.rb
|
88
|
+
- lib/acapi/version.rb
|
89
|
+
homepage: ''
|
90
|
+
licenses:
|
91
|
+
- MIT
|
92
|
+
post_install_message:
|
93
|
+
rdoc_options: []
|
94
|
+
require_paths:
|
95
|
+
- lib
|
96
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
hash: -3453926846909042401
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
segments:
|
112
|
+
- 0
|
113
|
+
hash: -3453926846909042401
|
114
|
+
requirements: []
|
115
|
+
rubyforge_project:
|
116
|
+
rubygems_version: 1.8.23
|
117
|
+
signing_key:
|
118
|
+
specification_version: 3
|
119
|
+
summary: Ruby implementation of the Acquia Cloud API.
|
120
|
+
test_files: []
|