acapi 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in acapi.gemspec
4
+ gemspec
@@ -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
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -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-----
@@ -0,0 +1,9 @@
1
+ require 'pathname'
2
+ require 'acapi/client'
3
+ require 'acapi/default'
4
+
5
+ module AcquiaCloudApi
6
+ def self.source_root
7
+ @source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
8
+ end
9
+ end
@@ -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,11 @@
1
+ module AcquiaCloudApi
2
+ class Client
3
+ module Files
4
+
5
+ def copy_files!(from_env, to_env)
6
+ post "/sites/#{site_name}/files-copy/#{from_env}/#{to_env}"
7
+ end
8
+
9
+ end
10
+ end
11
+ 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
@@ -0,0 +1,16 @@
1
+ require 'acapi/version'
2
+
3
+ module AcquiaCloudApi
4
+ module Default
5
+
6
+ API_ENDPOINT = "https://cloudapi.acquia.com/v1".freeze
7
+
8
+ class << self
9
+
10
+ def api_endpoint
11
+ ENV['ACAPI_API_ENDPOINT'] || API_ENDPOINT
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ module AcquiaCloudApi
2
+ VERSION = "0.0.1"
3
+ 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: []