azuki-api 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.travis.yml +16 -0
- data/Gemfile +4 -0
- data/README.md +128 -0
- data/Rakefile +41 -0
- data/azuki-api.gemspec +23 -0
- data/changelog.txt +204 -0
- data/lib/azuki-api.rb +1 -0
- data/lib/azuki/api.rb +146 -0
- data/lib/azuki/api/addons.rb +48 -0
- data/lib/azuki/api/apps.rb +71 -0
- data/lib/azuki/api/attachments.rb +14 -0
- data/lib/azuki/api/collaborators.rb +33 -0
- data/lib/azuki/api/config_vars.rb +33 -0
- data/lib/azuki/api/domains.rb +42 -0
- data/lib/azuki/api/errors.rb +26 -0
- data/lib/azuki/api/features.rb +45 -0
- data/lib/azuki/api/keys.rb +42 -0
- data/lib/azuki/api/login.rb +14 -0
- data/lib/azuki/api/logs.rb +18 -0
- data/lib/azuki/api/mock.rb +179 -0
- data/lib/azuki/api/mock/addons.rb +153 -0
- data/lib/azuki/api/mock/apps.rb +205 -0
- data/lib/azuki/api/mock/attachments.rb +19 -0
- data/lib/azuki/api/mock/cache/get_addons.json +1 -0
- data/lib/azuki/api/mock/cache/get_features.json +1 -0
- data/lib/azuki/api/mock/cache/get_user.json +1 -0
- data/lib/azuki/api/mock/collaborators.rb +55 -0
- data/lib/azuki/api/mock/config_vars.rb +49 -0
- data/lib/azuki/api/mock/domains.rb +80 -0
- data/lib/azuki/api/mock/features.rb +120 -0
- data/lib/azuki/api/mock/keys.rb +46 -0
- data/lib/azuki/api/mock/login.rb +22 -0
- data/lib/azuki/api/mock/logs.rb +20 -0
- data/lib/azuki/api/mock/processes.rb +198 -0
- data/lib/azuki/api/mock/releases.rb +69 -0
- data/lib/azuki/api/mock/stacks.rb +83 -0
- data/lib/azuki/api/mock/user.rb +16 -0
- data/lib/azuki/api/processes.rb +77 -0
- data/lib/azuki/api/releases.rb +33 -0
- data/lib/azuki/api/ssl_endpoints.rb +62 -0
- data/lib/azuki/api/stacks.rb +22 -0
- data/lib/azuki/api/user.rb +14 -0
- data/lib/azuki/api/vendor/okjson.rb +600 -0
- data/lib/azuki/api/version.rb +5 -0
- data/test/data/site.crt +19 -0
- data/test/data/site.key +27 -0
- data/test/test_addons.rb +193 -0
- data/test/test_apps.rb +147 -0
- data/test/test_attachments.rb +23 -0
- data/test/test_collaborators.rb +73 -0
- data/test/test_config_vars.rb +54 -0
- data/test/test_domains.rb +65 -0
- data/test/test_error_conditions.rb +11 -0
- data/test/test_features.rb +87 -0
- data/test/test_helper.rb +48 -0
- data/test/test_keys.rb +39 -0
- data/test/test_login.rb +20 -0
- data/test/test_logs.rb +29 -0
- data/test/test_processes.rb +245 -0
- data/test/test_releases.rb +73 -0
- data/test/test_ssl_endpoints.rb +132 -0
- data/test/test_stacks.rb +49 -0
- data/test/test_user.rb +13 -0
- metadata +168 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: afe6065c77aea82ac2829a163db1aa4b4d41ab64
|
4
|
+
data.tar.gz: a97499242dae8deb99b16754546300668a82380e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f5a0b3f09c2b808c5344f9e1e67ccef35c3e78685ab05774285e44765d6fbddf4812c88b6920dcea0012e2ac243fd4efddd7e048ca65b4ae1a5cbf00f9a17b43
|
7
|
+
data.tar.gz: 1dae8a18e0af5d66c5440bab57a12e222376c122feeda30f44b12a4d16ee13e347bab9bec03a8a09118b4dff9f9b16944ff7d63bb8623d0e1f99c1094dac5589
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
Azuki Ruby Client
|
2
|
+
==================
|
3
|
+
|
4
|
+
The Azuki Ruby Client is used to interact with the Azuki API from Ruby.
|
5
|
+
|
6
|
+
For more about the Azuki API see <http://api-docs.azukiapp.com>.
|
7
|
+
|
8
|
+
[![Build Status](https://travis-ci.org/azukiapp/azuki-api-ruby.png)](https://travis-ci.org/azukiapp/azuki-api-ruby)
|
9
|
+
|
10
|
+
Usage
|
11
|
+
-----
|
12
|
+
|
13
|
+
Start by creating a connection to Azuki with your credentials:
|
14
|
+
|
15
|
+
require 'azuki-api'
|
16
|
+
|
17
|
+
azuki = Azuki::API.new(:api_key => API_KEY) # use API Key
|
18
|
+
azuki = Azuki::API.new(:username => USERNAME, :password => PASSWORD) # use username and password
|
19
|
+
azuki = Azuki::API.new(:headers => {'User-Agent' => 'custom'}) # use custom header
|
20
|
+
|
21
|
+
NOTE: You can leave out the `:api_key` if `ENV['AZUKI_API_KEY']` is set instead.
|
22
|
+
|
23
|
+
Now you can make requests to the api.
|
24
|
+
|
25
|
+
Requests
|
26
|
+
--------
|
27
|
+
|
28
|
+
What follows is an overview of commands you can run for the client.
|
29
|
+
|
30
|
+
For additional details about any of the commands, see the [API docs](http://api-docs.azukiapp.com).
|
31
|
+
|
32
|
+
### Add-ons
|
33
|
+
|
34
|
+
azuki.delete_addon(APP, ADD_ON) # remove the ADD_ON add-on from the app named APP
|
35
|
+
azuki.post_addon(APP, ADD_ON) # add ADD_ON add-on to an the app named APP
|
36
|
+
azuki.put_addon(APP, ADD_ON) # update the ADD_ON add-on on the app named APP
|
37
|
+
azuki.get_addons # see a listing of all available add-ons
|
38
|
+
azuki.get_addons(APP) # see listing of installed add-ons for the app named APP
|
39
|
+
|
40
|
+
### Apps
|
41
|
+
|
42
|
+
azuki.delete_app(APP) # delete the app named APP
|
43
|
+
azuki.get_apps # get a list of your apps
|
44
|
+
azuki.get_app(APP) # get info about the app named APP
|
45
|
+
azuki.post_app # create an app with a generated name and the default stack
|
46
|
+
azuki.post_app_maintenance(APP, '1') # toggle maintenance mode for the app named APP
|
47
|
+
azuki.post_app('name' => 'app') # create an app with a specified name, APP
|
48
|
+
azuki.put_app('name' => 'myapp') # update an app to have a different name
|
49
|
+
|
50
|
+
### Collaborators
|
51
|
+
|
52
|
+
azuki.delete_collaborator(APP, 'email@example.com') # remove 'email@example.com' collaborator from APP app
|
53
|
+
azuki.get_collaborators(APP) # list collaborators for APP app
|
54
|
+
azuki.post_collaborator(APP, 'email@example.com') # add 'email@example.com' collaborator to APP app
|
55
|
+
|
56
|
+
### Config Variables
|
57
|
+
|
58
|
+
azuki.delete_config_var(APP, KEY) # remove KEY key from APP app
|
59
|
+
azuki.get_config_vars(APP) # get list of config vars for APP app
|
60
|
+
azuki.put_config_vars(APP, KEY => 'value') # set KEY key to 'value' for APP app
|
61
|
+
|
62
|
+
### Domains
|
63
|
+
|
64
|
+
azuki.delete_domain(APP, 'example.com') # remove the 'example.com' domain from the APP app
|
65
|
+
azuki.get_domains(APP) # list configured domains for the APP app
|
66
|
+
azuki.post_domain(APP, 'example.com') # add 'example.com' domain to the APP app
|
67
|
+
|
68
|
+
### Keys
|
69
|
+
|
70
|
+
azuki.delete_key('user@hostname.local') # remove the 'user@hostname.local' key
|
71
|
+
azuki.delete_keys # remove all keys
|
72
|
+
azuki.get_keys # list configured keys
|
73
|
+
azuki.post_key('key data') # add key defined by 'key data'
|
74
|
+
|
75
|
+
### Logs
|
76
|
+
|
77
|
+
azuki.get_logs(APP) # return logs information for APP app
|
78
|
+
|
79
|
+
### Processes
|
80
|
+
|
81
|
+
azuki.get_ps(APP) # list current processes for APP app
|
82
|
+
azuki.post_ps(APP, 'command') # run 'command' command in context of APP app
|
83
|
+
azuki.post_ps_restart(APP) # restart all processes for APP app
|
84
|
+
azuki.post_ps_scale(APP, TYPE, QTY) # scale TYPE type processes to QTY for APP app
|
85
|
+
azuki.post_ps_stop(APP, 'ps' => 'web.1') # stop 'web.1' process for APP app
|
86
|
+
azuki.post_ps_stop(APP, 'type' => 'web') # stop all 'web' processes for APP app
|
87
|
+
azuki.post_ps_restart(APP, 'ps' => 'web.1') # restart 'web.1' process for APP app
|
88
|
+
azuki.put_dynos(APP, DYNOS) # set number of dynos for bamboo app APP to DYNOS
|
89
|
+
azuki.put_workers(APP, WORKERS) # set number of workers for bamboo app APP to WORKERS
|
90
|
+
azuki.post_ps_scale(APP, 'worker', WORKERS) # set number of workers for cedar app APP to WORKERS
|
91
|
+
|
92
|
+
### Releases
|
93
|
+
|
94
|
+
azuki.get_releases(APP) # list of releases for the APP app
|
95
|
+
azuki.get_release(APP, 'v#') # get details of 'v#' release for APP app
|
96
|
+
azuki.post_release(APP, 'v#') # rollback APP app to 'v#' release
|
97
|
+
|
98
|
+
### Stacks
|
99
|
+
|
100
|
+
azuki.get_stack(APP) # list available stacks
|
101
|
+
azuki.put_stack(APP, STACK) # migrate APP app to STACK stack
|
102
|
+
|
103
|
+
### User
|
104
|
+
|
105
|
+
azuki.get_user # list user info
|
106
|
+
|
107
|
+
Mock
|
108
|
+
----
|
109
|
+
|
110
|
+
For testing (or practice) you can also use a simulated Azuki account:
|
111
|
+
|
112
|
+
require 'azuki-api'
|
113
|
+
|
114
|
+
azuki = Azuki::API.new(:api_key => API_KEY, :mock => true)
|
115
|
+
|
116
|
+
Commands will now behave as normal, however, instead of interacting with your actual Azuki account you'll be interacting with a **blank** test account. Note: test accounts will have NO apps to begin with. You'll need to create one:
|
117
|
+
|
118
|
+
azuki.post_app(:name => 'my-test-app')
|
119
|
+
|
120
|
+
Tests
|
121
|
+
-----
|
122
|
+
|
123
|
+
To run tests, first set `ENV['AZUKI_API_KEY']` to your api key. Then use `bundle exec rake` to run mock tests or `MOCK=false bundle exec rake` to run integration tests.
|
124
|
+
|
125
|
+
Meta
|
126
|
+
----
|
127
|
+
|
128
|
+
Released under the [MIT license](http://www.opensource.org/licenses/mit-license.php).
|
data/Rakefile
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
task :default => :test
|
6
|
+
|
7
|
+
Rake::TestTask.new do |task|
|
8
|
+
task.name = :test
|
9
|
+
task.test_files = FileList['test/test*.rb']
|
10
|
+
end
|
11
|
+
|
12
|
+
task :cache, [:api_key] do |task, args|
|
13
|
+
unless args.api_key
|
14
|
+
puts('cache requires an api key, please call as `cache[api_key]`')
|
15
|
+
else
|
16
|
+
require "#{File.dirname(__FILE__)}/lib/azuki/api"
|
17
|
+
azuki = Azuki::API.new(:api_key => args.api_key)
|
18
|
+
|
19
|
+
addons = Azuki::API::OkJson.encode(azuki.get_addons.body)
|
20
|
+
File.open("#{File.dirname(__FILE__)}/lib/azuki/api/mock/cache/get_addons.json", 'w') do |file|
|
21
|
+
file.write(addons)
|
22
|
+
end
|
23
|
+
|
24
|
+
app_name = "azuki-api-#{Time.now.to_i}"
|
25
|
+
app = azuki.post_app('name' => app_name)
|
26
|
+
features = Azuki::API::OkJson.encode(azuki.get_features(app_name).body)
|
27
|
+
File.open("#{File.dirname(__FILE__)}/lib/azuki/api/mock/cache/get_features.json", 'w') do |file|
|
28
|
+
file.write(features)
|
29
|
+
end
|
30
|
+
azuki.delete_app(app_name)
|
31
|
+
|
32
|
+
user = azuki.get_user.body
|
33
|
+
user["email"] = "user@example.com"
|
34
|
+
user["id"] = "123456@users.azukiapp.com"
|
35
|
+
user = Azuki::API::OkJson.encode(user)
|
36
|
+
File.open("#{File.dirname(__FILE__)}/lib/azuki/api/mock/cache/get_user.json", 'w') do |file|
|
37
|
+
file.write(user)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
data/azuki-api.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "azuki/api/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "azuki-api"
|
7
|
+
s.version = Azuki::API::VERSION
|
8
|
+
s.authors = ["Éverton Ribeiro"]
|
9
|
+
s.email = ["everton@azukiapp.com"]
|
10
|
+
s.homepage = "https://github.com/azukiapp/azuki-api-ruby"
|
11
|
+
s.summary = %q{Ruby Client for the Azuki API}
|
12
|
+
s.description = %q{Ruby Client for the Azuki API}
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
s.add_runtime_dependency 'excon', '~>0.20.0'
|
20
|
+
|
21
|
+
s.add_development_dependency 'minitest'
|
22
|
+
s.add_development_dependency 'rake'
|
23
|
+
end
|
data/changelog.txt
ADDED
@@ -0,0 +1,204 @@
|
|
1
|
+
0.3.8 02/27/2012
|
2
|
+
================
|
3
|
+
|
4
|
+
document custom headers
|
5
|
+
remove SHARED_DATABASE from mocks
|
6
|
+
clarify cedar scaling
|
7
|
+
clarify README examples
|
8
|
+
return more helpful error for blank app
|
9
|
+
add legacy tier to mocks
|
10
|
+
|
11
|
+
|
12
|
+
0.3.7 11/19/2012
|
13
|
+
================
|
14
|
+
|
15
|
+
bump excon to get https proxy fixes
|
16
|
+
|
17
|
+
0.3.6 10/31/2012
|
18
|
+
================
|
19
|
+
|
20
|
+
bump excon to latest
|
21
|
+
allow username/password params to automagically lookup api_key
|
22
|
+
readme cleanup/fixes
|
23
|
+
|
24
|
+
0.3.5 09/11/2012
|
25
|
+
================
|
26
|
+
|
27
|
+
add get_attachments and mocks
|
28
|
+
update enable features usage and mocks to use 200/201 based on update/create
|
29
|
+
|
30
|
+
0.3.4 08/15/2012
|
31
|
+
================
|
32
|
+
|
33
|
+
update excon to get SSLv3 fix
|
34
|
+
|
35
|
+
0.3.3 08/15/2012
|
36
|
+
================
|
37
|
+
|
38
|
+
update to more realistic self signed cert in tests
|
39
|
+
update body format for delete_ssl_endpoint
|
40
|
+
vendor latest okjson
|
41
|
+
patch okjson to work around encoding bug
|
42
|
+
bump excon and use blocking requests
|
43
|
+
|
44
|
+
0.3.2 08/01/2012
|
45
|
+
================
|
46
|
+
|
47
|
+
don't request v3 apis
|
48
|
+
first pass at ssl_endpoints support (no mocks yet)
|
49
|
+
bump excon dep
|
50
|
+
|
51
|
+
0.3.1 07/20/2012
|
52
|
+
================
|
53
|
+
|
54
|
+
fix bug in maintenance mocks not being reset after app delet
|
55
|
+
|
56
|
+
0.3.0 07/20/2012
|
57
|
+
================
|
58
|
+
|
59
|
+
fixes for url segment escaping of config_vars, domains and keys
|
60
|
+
add get_app_maintenance
|
61
|
+
|
62
|
+
0.2.13 07/18/2012
|
63
|
+
=================
|
64
|
+
|
65
|
+
bump excon to rescue nonblock errors from readline
|
66
|
+
|
67
|
+
0.2.12 07/17/2012
|
68
|
+
=================
|
69
|
+
|
70
|
+
more last minute excon fixes (proxies are hard)
|
71
|
+
|
72
|
+
0.2.11 07/17/2012
|
73
|
+
=================
|
74
|
+
|
75
|
+
excon bump for further fixes
|
76
|
+
|
77
|
+
0.2.10 07/16/2012
|
78
|
+
=================
|
79
|
+
|
80
|
+
excon bump for fixes
|
81
|
+
|
82
|
+
0.2.9 07/16/2012
|
83
|
+
================
|
84
|
+
|
85
|
+
bump excon dep to get proxy fixes
|
86
|
+
|
87
|
+
0.2.8 07/08/2012
|
88
|
+
================
|
89
|
+
|
90
|
+
return to OkJson usage, as json breaks with some legacy toolbelt installs
|
91
|
+
|
92
|
+
0.2.7 07/05/2012
|
93
|
+
================
|
94
|
+
|
95
|
+
doc fixes (fixes delete_addon and improves consistency)
|
96
|
+
post_collaborator returns 201 when users does not yet exist
|
97
|
+
use json (instead of okjson) when available
|
98
|
+
update excon dependency
|
99
|
+
|
100
|
+
0.2.6 06/21/2012
|
101
|
+
================
|
102
|
+
|
103
|
+
processes scale mocks now more accurately update process list
|
104
|
+
|
105
|
+
0.2.5 06/13/2012
|
106
|
+
================
|
107
|
+
|
108
|
+
make post_release release param optional (defaults to latest)
|
109
|
+
fix for contructing addon_params
|
110
|
+
fail gracefully on non-http-status errors
|
111
|
+
|
112
|
+
0.2.4 05/31/2012
|
113
|
+
================
|
114
|
+
|
115
|
+
fix overly lax GET /user stub reveealed by changes in excon 0.14.0
|
116
|
+
|
117
|
+
0.2.3 05/31/2012
|
118
|
+
================
|
119
|
+
|
120
|
+
fix overly lax DELETE /user/keys stub revealed by changes in excon 0.14.0
|
121
|
+
|
122
|
+
0.2.2 05/31/2012
|
123
|
+
================
|
124
|
+
|
125
|
+
bump excon dep for improved stubs/instrumentation
|
126
|
+
|
127
|
+
0.2.1 05/24/2012
|
128
|
+
================
|
129
|
+
|
130
|
+
update post_ps to properly munge ps_env params
|
131
|
+
|
132
|
+
0.2.0 05/23/2012
|
133
|
+
================
|
134
|
+
|
135
|
+
fix mocks for stack requests
|
136
|
+
add features (labs) functionality
|
137
|
+
|
138
|
+
0.1.8 05/21/2012
|
139
|
+
================
|
140
|
+
|
141
|
+
fix tests to be individually runnable
|
142
|
+
update cache function to get user data
|
143
|
+
update domain tests to match new default plugins
|
144
|
+
update collaborators mocks to be more accurate
|
145
|
+
update domain tests to use random_domain
|
146
|
+
use better transfer targets in app tests
|
147
|
+
fix timestamp generation in mocks
|
148
|
+
fix release creation in mocks
|
149
|
+
fix release rollback mocks to rollback to last when no version is given
|
150
|
+
more accurate addons mocks
|
151
|
+
more accurate process mocks for attached processes
|
152
|
+
|
153
|
+
|
154
|
+
0.1.7 05/15/2012
|
155
|
+
================
|
156
|
+
|
157
|
+
consolidate NotFound error handling to work more like other errors
|
158
|
+
fixes for ps:scale mock accuracy
|
159
|
+
fix default command for cedar web process mocks
|
160
|
+
|
161
|
+
0.1.6 05/09/2012
|
162
|
+
================
|
163
|
+
|
164
|
+
fixes for GET /apps/:app/releases/:release mocks
|
165
|
+
|
166
|
+
0.1.5 05/09/2012
|
167
|
+
================
|
168
|
+
|
169
|
+
add support for GET /apps/:app/releases/current
|
170
|
+
|
171
|
+
0.1.4 05/09/2012
|
172
|
+
================
|
173
|
+
|
174
|
+
add DELETE /domains
|
175
|
+
add POST /login
|
176
|
+
|
177
|
+
0.1.3 05/03/2012
|
178
|
+
================
|
179
|
+
|
180
|
+
update README examples to include put_app
|
181
|
+
correct mocks to change git/web urls during app rename
|
182
|
+
split out known azuki errors into their own error classes
|
183
|
+
|
184
|
+
0.1.2 04/10/2012
|
185
|
+
================
|
186
|
+
|
187
|
+
less aggressive gzip usage (checks content-encoding)
|
188
|
+
update cache
|
189
|
+
|
190
|
+
0.1.1 04/06/2012
|
191
|
+
================
|
192
|
+
|
193
|
+
readme/docs updates and fixes
|
194
|
+
add get_user method
|
195
|
+
request/use gzip responses
|
196
|
+
update vendored okjson
|
197
|
+
allow passing config data to addon install
|
198
|
+
fix STACK usage in mocks
|
199
|
+
bump excon dep
|
200
|
+
|
201
|
+
0.1.0 02/02/2012
|
202
|
+
================
|
203
|
+
|
204
|
+
Initial release
|
data/lib/azuki-api.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), "azuki", "api"))
|
data/lib/azuki/api.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
require "base64"
|
2
|
+
require "excon"
|
3
|
+
require "securerandom"
|
4
|
+
require "uri"
|
5
|
+
require "zlib"
|
6
|
+
|
7
|
+
__LIB_DIR__ = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
8
|
+
unless $LOAD_PATH.include?(__LIB_DIR__)
|
9
|
+
$LOAD_PATH.unshift(__LIB_DIR__)
|
10
|
+
end
|
11
|
+
|
12
|
+
require "azuki/api/vendor/okjson"
|
13
|
+
|
14
|
+
require "azuki/api/errors"
|
15
|
+
require "azuki/api/mock"
|
16
|
+
require "azuki/api/version"
|
17
|
+
|
18
|
+
require "azuki/api/addons"
|
19
|
+
require "azuki/api/apps"
|
20
|
+
require "azuki/api/attachments"
|
21
|
+
require "azuki/api/collaborators"
|
22
|
+
require "azuki/api/config_vars"
|
23
|
+
require "azuki/api/domains"
|
24
|
+
require "azuki/api/features"
|
25
|
+
require "azuki/api/keys"
|
26
|
+
require "azuki/api/login"
|
27
|
+
require "azuki/api/logs"
|
28
|
+
require "azuki/api/processes"
|
29
|
+
require "azuki/api/releases"
|
30
|
+
require "azuki/api/ssl_endpoints"
|
31
|
+
require "azuki/api/stacks"
|
32
|
+
require "azuki/api/user"
|
33
|
+
|
34
|
+
srand
|
35
|
+
|
36
|
+
module Azuki
|
37
|
+
class API
|
38
|
+
|
39
|
+
HEADERS = {
|
40
|
+
'Accept' => 'application/json',
|
41
|
+
'Accept-Encoding' => 'gzip',
|
42
|
+
#'Accept-Language' => 'en-US, en;q=0.8',
|
43
|
+
'User-Agent' => "azuki-rb/#{Azuki::API::VERSION}",
|
44
|
+
'X-Ruby-Version' => RUBY_VERSION,
|
45
|
+
'X-Ruby-Platform' => RUBY_PLATFORM
|
46
|
+
}
|
47
|
+
|
48
|
+
OPTIONS = {
|
49
|
+
:headers => {},
|
50
|
+
:host => 'api.azukiapp.com',
|
51
|
+
:nonblock => false,
|
52
|
+
:scheme => 'https'
|
53
|
+
}
|
54
|
+
|
55
|
+
def initialize(options={})
|
56
|
+
options = OPTIONS.merge(options)
|
57
|
+
|
58
|
+
@api_key = options.delete(:api_key) || ENV['AZUKI_API_KEY']
|
59
|
+
if !@api_key && options.has_key?(:username) && options.has_key?(:password)
|
60
|
+
@connection = Excon.new("#{options[:scheme]}://#{options[:host]}", options.merge(:headers => HEADERS))
|
61
|
+
@api_key = self.post_login(options[:username], options[:password]).body["api_key"]
|
62
|
+
end
|
63
|
+
|
64
|
+
user_pass = ":#{@api_key}"
|
65
|
+
options[:headers] = HEADERS.merge({
|
66
|
+
'Authorization' => "Basic #{Base64.encode64(user_pass).gsub("\n", '')}",
|
67
|
+
}).merge(options[:headers])
|
68
|
+
|
69
|
+
@connection = Excon.new("#{options[:scheme]}://#{options[:host]}", options)
|
70
|
+
end
|
71
|
+
|
72
|
+
def request(params, &block)
|
73
|
+
begin
|
74
|
+
response = @connection.request(params, &block)
|
75
|
+
rescue Excon::Errors::HTTPStatusError => error
|
76
|
+
klass = case error.response.status
|
77
|
+
when 401 then Azuki::API::Errors::Unauthorized
|
78
|
+
when 402 then Azuki::API::Errors::VerificationRequired
|
79
|
+
when 403 then Azuki::API::Errors::Forbidden
|
80
|
+
when 404
|
81
|
+
if error.request[:path].match /\/apps\/\/.*/
|
82
|
+
Azuki::API::Errors::NilApp
|
83
|
+
else
|
84
|
+
Azuki::API::Errors::NotFound
|
85
|
+
end
|
86
|
+
when 408 then Azuki::API::Errors::Timeout
|
87
|
+
when 422 then Azuki::API::Errors::RequestFailed
|
88
|
+
when 423 then Azuki::API::Errors::Locked
|
89
|
+
when /50./ then Azuki::API::Errors::RequestFailed
|
90
|
+
else Azuki::API::Errors::ErrorWithResponse
|
91
|
+
end
|
92
|
+
|
93
|
+
reerror = klass.new(error.message, error.response)
|
94
|
+
reerror.set_backtrace(error.backtrace)
|
95
|
+
raise(reerror)
|
96
|
+
end
|
97
|
+
|
98
|
+
if response.body && !response.body.empty?
|
99
|
+
if response.headers['Content-Encoding'] == 'gzip'
|
100
|
+
response.body = Zlib::GzipReader.new(StringIO.new(response.body)).read
|
101
|
+
end
|
102
|
+
begin
|
103
|
+
response.body = Azuki::API::OkJson.decode(response.body)
|
104
|
+
rescue
|
105
|
+
# leave non-JSON body as is
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# reset (non-persistent) connection
|
110
|
+
@connection.reset
|
111
|
+
|
112
|
+
response
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def app_params(params)
|
118
|
+
app_params = {}
|
119
|
+
params.each do |key, value|
|
120
|
+
app_params["app[#{key}]"] = value
|
121
|
+
end
|
122
|
+
app_params
|
123
|
+
end
|
124
|
+
|
125
|
+
def addon_params(params)
|
126
|
+
params.inject({}) do |accum, (key, value)|
|
127
|
+
accum["config[#{key}]"] = value
|
128
|
+
accum
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def escape(string)
|
133
|
+
CGI.escape(string).gsub('.', '%2E')
|
134
|
+
end
|
135
|
+
|
136
|
+
def ps_options(params)
|
137
|
+
if ps_env = params.delete(:ps_env) || params.delete('ps_env')
|
138
|
+
ps_env.each do |key, value|
|
139
|
+
params["ps_env[#{key}]"] = value
|
140
|
+
end
|
141
|
+
end
|
142
|
+
params
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
end
|