dawn-api 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f67aba9063e02175a8f39faef656f1046d01a474
4
+ data.tar.gz: 1b4424a7e02702a2acf8625162e30f233f58c6ea
5
+ SHA512:
6
+ metadata.gz: c680999789ae45609b11fc9e311ae2a9a09437b9d182ab1d0beb5c30f0b9111e06466d364e3a85047bd6d16b52d6fed140d9abc7790fff925680442016e3e779
7
+ data.tar.gz: 569ba8aab02dbd02e00952dcca4b32d5d6f251222d3ae8047ad448c0f748fe882bb3e781ccac24f7ed2d5441ea6ab496203683855b42db4fd3b75d4c6bef1e77
@@ -0,0 +1,40 @@
1
+ require 'dawn/api/base_api'
2
+ require 'dawn/api/domain'
3
+
4
+ module Dawn
5
+ class App
6
+ class Domains
7
+
8
+ include BaseApi
9
+
10
+ attr_reader :app
11
+
12
+ def initialize(app)
13
+ @app = app
14
+ end
15
+
16
+ def create(options={})
17
+ Domain.new(json_request(
18
+ expects: 200,
19
+ method: :post,
20
+ path: "/apps/#{app.id}/domains",
21
+ body: options.to_json
22
+ )["domain"]).tap { |d| d.app = @app }
23
+ end
24
+
25
+ def all(options={})
26
+ json_request(
27
+ expects: 200,
28
+ method: :get,
29
+ path: "/apps/#{app.id}/domains",
30
+ query: options
31
+ ).map { |hsh| Domain.new(hsh["domain"]).tap { |d| d.app = @app } }
32
+ end
33
+
34
+ def find(options={})
35
+ Domain.find(options).tap { |d| d.app = @app }
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require 'dawn/api/base_api'
2
+ require 'dawn/api/drain'
3
+
4
+ module Dawn
5
+ class App
6
+ class Drains
7
+
8
+ include BaseApi
9
+
10
+ attr_reader :app
11
+
12
+ def initialize(app)
13
+ @app = app
14
+ end
15
+
16
+ def create(options={})
17
+ Drain.new(json_request(
18
+ expects: 200,
19
+ method: :post,
20
+ path: "/apps/#{app.id}/drains",
21
+ body: options.to_json
22
+ )["drain"]).tap { |d| d.app = @app }
23
+ end
24
+
25
+ def all(options={})
26
+ json_request(
27
+ expects: 200,
28
+ method: :get,
29
+ path: "/apps/#{app.id}/drains",
30
+ query: options
31
+ ).map { |hsh| Drain.new(hsh["drain"]).tap { |d| d.app = @app } }
32
+ end
33
+
34
+ def find(options={})
35
+ Drain.find(options).tap { |d| d.app = @app }
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,37 @@
1
+ require 'dawn/api/base_api'
2
+
3
+ module Dawn
4
+ class App
5
+ class Env < Hash
6
+
7
+ include BaseApi
8
+
9
+ attr_reader :app
10
+
11
+ def initialize(app, data)
12
+ @app = app
13
+ super()
14
+ replace(data)
15
+ end
16
+
17
+ def refresh(options={})
18
+ replace json_request(
19
+ expects: 200,
20
+ method: :get,
21
+ path: "/apps/#{app.id}/env",
22
+ query: options
23
+ )["env"]
24
+ end
25
+
26
+ def save(options={})
27
+ replace json_request(
28
+ expects: 200,
29
+ method: :post,
30
+ path: "/apps/#{app.id}/env",
31
+ body: { env: merge(options) }.to_json
32
+ )["env"]
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,49 @@
1
+ require 'dawn/api/base_api'
2
+ require 'dawn/api/gear'
3
+
4
+ module Dawn
5
+ class App
6
+ class Gears
7
+
8
+ include BaseApi
9
+
10
+ attr_reader :app
11
+
12
+ def initialize(app)
13
+ @app = app
14
+ end
15
+
16
+ def create(options={})
17
+ Gear.new(json_request(
18
+ expects: 200,
19
+ method: :post,
20
+ path: "/apps/#{app.id}/gears",
21
+ body: options.to_json
22
+ )["gear"]).tap { |d| d.app = @app }
23
+ end
24
+
25
+ def all(options={})
26
+ json_request(
27
+ expects: 200,
28
+ method: :get,
29
+ path: "/apps/#{app.id}/gears",
30
+ query: options
31
+ ).map { |hsh| Gear.new(hsh["gear"]).tap { |d| d.app = @app } }
32
+ end
33
+
34
+ def find(options={})
35
+ Gear.find(options).tap { |d| d.app = @app }
36
+ end
37
+
38
+ def restart(options={})
39
+ request(
40
+ expects: 200,
41
+ method: :post,
42
+ path: "/apps/#{app.id}/gears/restart",
43
+ body: options.to_json
44
+ )
45
+ end
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,131 @@
1
+ require 'dawn/api/hosts'
2
+ require 'dawn/api/base_api'
3
+ require 'dawn/api/app/env'
4
+ require 'dawn/api/app/gears'
5
+ require 'dawn/api/app/drains'
6
+ require 'dawn/api/app/domains'
7
+
8
+ module Dawn
9
+ class App
10
+
11
+ include BaseApi
12
+
13
+ attr_reader :data
14
+ attr_reader :env
15
+
16
+ def initialize(hsh)
17
+ @data = hsh
18
+ @env = Env.new(self, @data.delete("env"))
19
+ end
20
+
21
+ def name
22
+ data["name"]
23
+ end
24
+
25
+ def id
26
+ data["id"]
27
+ end
28
+
29
+ def formation
30
+ data["formation"]
31
+ end
32
+
33
+ def git
34
+ data["git"]
35
+ end
36
+
37
+ def restart(options={})
38
+ request(
39
+ expects: 200,
40
+ method: :delete,
41
+ path: "/apps/#{id}/gears",
42
+ query: options
43
+ )
44
+ end
45
+
46
+ def gears
47
+ @gears ||= Gears.new self
48
+ end
49
+
50
+ def drains
51
+ @drains ||= Drains.new self
52
+ end
53
+
54
+ def domains
55
+ @domains ||= Domains.new self
56
+ end
57
+
58
+ def logs(options={})
59
+ url = json_request(
60
+ expects: 200,
61
+ method: :get,
62
+ path: "/apps/#{id}/logs",
63
+ query: options
64
+ )["logs"]
65
+ "http://#{Dawn.log_host}#{url}"
66
+ end
67
+
68
+ def update(options={})
69
+ data.merge!(json_request(
70
+ expects: 200,
71
+ method: :patch,
72
+ path: "/apps/#{id}",
73
+ body: { name: name }.merge(options).to_json
74
+ )["app"])
75
+ end
76
+
77
+ def scale(options={})
78
+ request(
79
+ expects: 200,
80
+ method: :post,
81
+ path: "/apps/#{id}/scale",
82
+ body: options.to_json
83
+ )
84
+ end
85
+
86
+ def destroy(options={})
87
+ request(
88
+ expects: 200,
89
+ method: :delete,
90
+ path: "/apps/#{id}",
91
+ query: options
92
+ )
93
+ end
94
+
95
+ def self.all(options={})
96
+ json_request(
97
+ expects: 200,
98
+ method: :get,
99
+ path: "/apps",
100
+ query: options
101
+ ).map { |hsh| new(hsh["app"]) }
102
+ end
103
+
104
+ def self.create(options)
105
+ new json_request(
106
+ expects: 200,
107
+ method: :post,
108
+ path: '/apps',
109
+ body: options.to_json
110
+ )["app"]
111
+ end
112
+
113
+ def self.find(options)
114
+ path = options[:id] ? "/apps/#{options.delete(:id)}" : "/apps"
115
+ hsh = json_request(
116
+ expects: 200,
117
+ method: :get,
118
+ path: path,
119
+ query: options
120
+ )
121
+ hsh = hsh.first if hsh.is_a?(Array)
122
+ hsh && new(hsh["app"])
123
+ end
124
+
125
+ def self.destroy(options)
126
+ app = find options
127
+ app.destroy if app
128
+ end
129
+
130
+ end
131
+ end
@@ -0,0 +1,66 @@
1
+ require 'dawn/api/version'
2
+ require 'excon'
3
+ require 'netrc'
4
+
5
+ module Dawn
6
+
7
+ HEADERS = {
8
+ 'Accept' => 'application/json',
9
+ 'Content-Type' => 'application/json',
10
+ 'Accept-Encoding' => 'gzip',
11
+ 'User-Agent' => "dawn/#{API::VERSION}",
12
+ 'X-Ruby-Version' => RUBY_VERSION,
13
+ 'X-Ruby-Platform' => RUBY_PLATFORM
14
+ }
15
+
16
+ OPTIONS = {
17
+ headers: {},
18
+ host: 'api.dawn.dev',
19
+ nonblock: false,
20
+ scheme: 'http'
21
+ }
22
+
23
+ class AuthenticationError < RuntimeError
24
+ end
25
+
26
+ def self.request(options)
27
+ Dawn.authenticate unless @connection
28
+ @connection.request(options)
29
+ end
30
+
31
+ def self.authenticate(options={})
32
+ options = OPTIONS.merge options
33
+ options[:headers] = options[:headers].merge(HEADERS)
34
+ @api_key = options.delete(:api_key) || ENV['DAWN_API_KEY']
35
+
36
+ if !@api_key
37
+ hostname = options[:host]
38
+ url = "#{options[:scheme]}://#{hostname}"
39
+
40
+ if options.key?(:username) && options.key?(:password)
41
+ username = options.delete(:username)
42
+ password = options.delete(:password)
43
+
44
+ @connection = Excon.new url, headers: HEADERS
45
+
46
+ @api_key = User.login(username: username, password: password)['api_key']
47
+
48
+ netrc = Netrc.read
49
+ netrc[hostname] = username, @api_key
50
+ netrc.save
51
+ else
52
+ netrc = Netrc.read
53
+ username, api_key = netrc[hostname]
54
+ if api_key
55
+ @api_key = api_key
56
+ else
57
+ raise AuthenticationError, "api_key was not found, try dawn login to reset your .netrc"
58
+ # "please provide a DAWN_API_KEY, username and password, or update your .netrc with the dawn details (use dawn login)"
59
+ end
60
+ end
61
+ end
62
+ @headers = HEADERS.merge 'Authorization' => "Token token=\"#{@api_key}\""
63
+ @connection = Excon.new "#{options[:scheme]}://#{options[:host]}", headers: @headers
64
+ end
65
+
66
+ end
@@ -0,0 +1,23 @@
1
+ require 'dawn/api/authenticate'
2
+ require 'json'
3
+
4
+ module Dawn
5
+ module BaseApi
6
+ module Extension
7
+ def request(options)
8
+ Dawn.request options
9
+ end
10
+
11
+ def json_request(options)
12
+ JSON.load request(options).body
13
+ end
14
+ end
15
+
16
+ include Extension
17
+
18
+ def self.included(mod)
19
+ mod.extend Extension
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,80 @@
1
+ require 'dawn/api/base_api'
2
+
3
+ module Dawn
4
+ class Domain
5
+
6
+ include BaseApi
7
+
8
+ attr_reader :data
9
+ attr_writer :app
10
+
11
+ def initialize(data)
12
+ @app = nil
13
+ @data = data
14
+ end
15
+
16
+ def app_id
17
+ data["app_id"]
18
+ end
19
+
20
+ def app
21
+ @app ||= App.find(id: app_id)
22
+ end
23
+
24
+ def id
25
+ data["id"]
26
+ end
27
+
28
+ def url
29
+ data["url"]
30
+ end
31
+
32
+ def refresh
33
+ @data = json_request(
34
+ expects: 200,
35
+ method: :get,
36
+ path: "/domains/#{id}",
37
+ query: options
38
+ )["domain"]
39
+ end
40
+
41
+ def update(options={})
42
+ request(
43
+ expects: 200,
44
+ method: :post,
45
+ path: "/domains/#{id}",
46
+ body: options.to_json
47
+ )
48
+ end
49
+
50
+ def destroy(options={})
51
+ request(
52
+ expects: 200,
53
+ method: :delete,
54
+ path: "/domains/#{id}",
55
+ query: options
56
+ )
57
+ end
58
+
59
+ def self.all(options={})
60
+ json_request(
61
+ expects: 200,
62
+ method: :get,
63
+ path: "/domains",
64
+ query: options
65
+ ).map { |hsh| new hsh["domain"] }
66
+ end
67
+
68
+ def self.find(options)
69
+ id = options.delete(:id)
70
+
71
+ new json_request(
72
+ expects: 200,
73
+ method: :get,
74
+ path: "/domains/#{id}",
75
+ query: options
76
+ )["domain"]
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1,80 @@
1
+ require 'dawn/api/base_api'
2
+
3
+ module Dawn
4
+ class Drain
5
+
6
+ include BaseApi
7
+
8
+ attr_reader :data
9
+ attr_writer :app
10
+
11
+ def initialize(data)
12
+ @app = nil
13
+ @data = data
14
+ end
15
+
16
+ def app_id
17
+ data["app_id"]
18
+ end
19
+
20
+ def app
21
+ @app ||= App.find(id: app_id)
22
+ end
23
+
24
+ def id
25
+ data["id"]
26
+ end
27
+
28
+ def url
29
+ data["url"]
30
+ end
31
+
32
+ def refresh
33
+ @data = json_request(
34
+ expects: 200,
35
+ method: :get,
36
+ path: "/drains/#{id}",
37
+ query: options
38
+ )["drain"]
39
+ end
40
+
41
+ def update(options={})
42
+ request(
43
+ expects: 200,
44
+ method: :post,
45
+ path: "/drains/#{id}",
46
+ body: options.to_json
47
+ )
48
+ end
49
+
50
+ def destroy(options={})
51
+ request(
52
+ expects: 200,
53
+ method: :delete,
54
+ path: "/drains/#{id}",
55
+ query: options
56
+ )
57
+ end
58
+
59
+ def self.all(options={})
60
+ json_request(
61
+ expects: 200,
62
+ method: :get,
63
+ path: "/drains",
64
+ query: options
65
+ ).map { |hsh| new hsh["drain"] }
66
+ end
67
+
68
+ def self.find(options={})
69
+ id = options.delete(:id)
70
+
71
+ new json_request(
72
+ expects: 200,
73
+ method: :get,
74
+ path: "/drains/#{id}",
75
+ query: options
76
+ )["drain"]
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1,101 @@
1
+ require 'dawn/api/base_api'
2
+
3
+ module Dawn
4
+ class Gear
5
+
6
+ include BaseApi
7
+
8
+ attr_reader :data
9
+ attr_writer :app
10
+
11
+ def initialize(data)
12
+ @app = nil
13
+ @data = data
14
+ end
15
+
16
+ def app_id
17
+ data["app_id"]
18
+ end
19
+
20
+ def app
21
+ @app ||= App.find(id: app_id)
22
+ end
23
+
24
+ def id
25
+ data["id"]
26
+ end
27
+
28
+ def name
29
+ data["name"]
30
+ end
31
+
32
+ def uptime
33
+ data["uptime"]
34
+ end
35
+
36
+ def type
37
+ data["type"]
38
+ end
39
+
40
+ def number
41
+ data["number"]
42
+ end
43
+
44
+ def refresh
45
+ @data = json_request(
46
+ expects: 200,
47
+ method: :get,
48
+ path: "/gears/#{id}",
49
+ query: options
50
+ )["gear"]
51
+ end
52
+
53
+ def restart(options={})
54
+ request(
55
+ expects: 200,
56
+ method: :post,
57
+ path: "/gears/#{id}/restart",
58
+ query: options
59
+ )
60
+ end
61
+
62
+ def update(options={})
63
+ request(
64
+ expects: 200,
65
+ method: :post,
66
+ path: "/gears/#{id}",
67
+ body: options.to_json
68
+ )
69
+ end
70
+
71
+ def destroy(options={})
72
+ request(
73
+ expects: 200,
74
+ method: :delete,
75
+ path: "/gears/#{id}",
76
+ query: options
77
+ )
78
+ end
79
+
80
+ def self.all(options={})
81
+ json_request(
82
+ expects: 200,
83
+ method: :get,
84
+ path: "/gears",
85
+ query: options
86
+ ).map { |hsh| new hsh["gear"] }
87
+ end
88
+
89
+ def self.find(options)
90
+ id = options.delete(:id)
91
+
92
+ new json_request(
93
+ expects: 200,
94
+ method: :get,
95
+ path: "/gears/#{id}",
96
+ query: options
97
+ )["gear"]
98
+ end
99
+
100
+ end
101
+ end
@@ -0,0 +1,11 @@
1
+ module Dawn
2
+
3
+ def self.git_host
4
+ "dawn.dev"
5
+ end
6
+
7
+ def self.log_host
8
+ "dawn.dev:8001"
9
+ end
10
+
11
+ end
@@ -0,0 +1,73 @@
1
+ require 'dawn/api/base_api'
2
+
3
+ module Dawn
4
+ class Key
5
+
6
+ include BaseApi
7
+
8
+ attr_reader :data
9
+
10
+ def initialize(data)
11
+ @data = data
12
+ end
13
+
14
+ def id
15
+ data["id"]
16
+ end
17
+
18
+ def fingerprint
19
+ data["fingerprint"]
20
+ end
21
+
22
+ def key
23
+ data["key"]
24
+ end
25
+
26
+ def destroy
27
+ request(
28
+ method: :delete,
29
+ expects: 200,
30
+ path: "/account/keys/#{id}"
31
+ )
32
+ end
33
+
34
+ def self.add(pubkey)
35
+ new json_request(
36
+ method: :post,
37
+ expects: 200,
38
+ path: '/account/keys',
39
+ query: { key: pubkey }
40
+ )["key"]
41
+ end
42
+
43
+ def self.get(id)
44
+ new json_request(
45
+ method: :get,
46
+ expects: 200,
47
+ path: "/account/keys/#{id}"
48
+ )["key"]
49
+ end
50
+
51
+ def self.all(options={})
52
+ json_request(
53
+ method: :get,
54
+ expects: 200,
55
+ path: '/account/keys',
56
+ query: options
57
+ ).map { |hsh| new(hsh["key"]) }
58
+ end
59
+
60
+ def self.destroy(options={})
61
+ request(
62
+ method: :delete,
63
+ expects: 200,
64
+ path: "/account/keys/#{options[:id]}"
65
+ )
66
+ end
67
+
68
+ class << self
69
+ private :new
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,18 @@
1
+ require 'dawn/api/base_api'
2
+
3
+ module Dawn
4
+ class User
5
+
6
+ include BaseApi
7
+
8
+ def self.login(options={})
9
+ json_request(
10
+ expects: 200,
11
+ method: :post,
12
+ path: '/login',
13
+ body: options.to_json
14
+ )
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Dawn
2
+ module API
3
+ module Version
4
+ MAJOR = 0
5
+ MINOR = 9
6
+ PATCH = 0
7
+ BUILD = nil
8
+ STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join(".").freeze
9
+ end
10
+ # backward compatibility
11
+ VERSION = Version::STRING
12
+ end
13
+ end
data/lib/dawn/api.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'json'
2
+
3
+ require 'dawn/api/version'
4
+ require 'dawn/api/authenticate'
5
+ require 'dawn/api/app'
6
+ require 'dawn/api/domain'
7
+ require 'dawn/api/drain'
8
+ require 'dawn/api/gear'
9
+ require 'dawn/api/key'
10
+ require 'dawn/api/login'
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dawn-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - Blaž Hrastnik
8
+ - Corey Powell
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-06-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: excon
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '0.34'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '0.34'
28
+ - !ruby/object:Gem::Dependency
29
+ name: json
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.8'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.8'
42
+ - !ruby/object:Gem::Dependency
43
+ name: netrc
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '0.7'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '0.7'
56
+ - !ruby/object:Gem::Dependency
57
+ name: sshkey
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.6'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.6'
70
+ description: Dawn Client API
71
+ email:
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/dawn/api.rb
77
+ - lib/dawn/api/app.rb
78
+ - lib/dawn/api/app/domains.rb
79
+ - lib/dawn/api/app/drains.rb
80
+ - lib/dawn/api/app/env.rb
81
+ - lib/dawn/api/app/gears.rb
82
+ - lib/dawn/api/authenticate.rb
83
+ - lib/dawn/api/base_api.rb
84
+ - lib/dawn/api/domain.rb
85
+ - lib/dawn/api/drain.rb
86
+ - lib/dawn/api/gear.rb
87
+ - lib/dawn/api/hosts.rb
88
+ - lib/dawn/api/key.rb
89
+ - lib/dawn/api/login.rb
90
+ - lib/dawn/api/version.rb
91
+ homepage: https://github.com/dawn/dawn-api
92
+ licenses:
93
+ - MIT
94
+ metadata: {}
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 2.2.2
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: Dawn API
115
+ test_files: []
116
+ has_rdoc: