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