acapi 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.
- 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: []
|