docker_cloud 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 443a84e43b49be4b728ccab3f42ef87ffbba72c3
4
- data.tar.gz: 57ced92d05639f74b56486fea33a26980ca1f183
3
+ metadata.gz: 2aab083ede77f5ec4093334d3cb5bded5d3fb762
4
+ data.tar.gz: 942bea1eaaafa7d2ac87ef8aace4834d7715c7b8
5
5
  SHA512:
6
- metadata.gz: b3732bed627e2ba432bb6e1034c3aeb996d85646b03652091dc3005eeb40e73c78cd04d2f227a0e69fad73fef457a7191500dd90a6079e33156102ffb0825684
7
- data.tar.gz: 5592766ecc087d3e702034a02776ccf4ee4179b6a93145a51b711e65660a237ab8eaccba3d58d7d72207042d7cbd86ee1d9154c1eb1d6c87c64f8535675c2a5d
6
+ metadata.gz: e254f248d11472c3fcfc8393ffe7f92d114f6c7887cfe429753cb9298b2b22ad77f3b84a51c254df4992c92caeb45d853dffd489808bf144f127d594faf91329
7
+ data.tar.gz: a9ac491c8ad7d31e0554210f4cf8fa683683eea85e37b51d55c349750148ac376582edc050aa6205dbf98d9a0b8c72ae0c48fc9253460de852c0265d2f9bd9dc
@@ -0,0 +1,5 @@
1
+ FROM ruby:2.2
2
+ RUN mkdir /workspace
3
+ WORKDIR /workspace
4
+ ADD . /workspace
5
+ RUN bundle install --jobs 4
data/README.md CHANGED
@@ -68,6 +68,49 @@ node_types.all
68
68
  # Get a node type
69
69
  # node_types.get(<provider_name>, <name>)
70
70
  node_types.get('softlayer', '1x2.0GHzCore-2GB')
71
+
72
+ # Events
73
+ events = client.events
74
+
75
+ # Event listeners
76
+ events.on(:open) do |event|
77
+ puts "OPEN"
78
+ end
79
+
80
+ events.on(:close) do |event|
81
+ puts "Code: #{event.code}"
82
+ puts "Reason: #{event.reason}"
83
+ end
84
+
85
+ events.on(:error) do |event|
86
+ puts "Message: #{event.message}"
87
+ end
88
+
89
+ events.on(:message) do |event|
90
+ puts "Type: #{event.type}"
91
+ puts "Action: #{event.action}"
92
+ puts "Parents: #{event.parents}"
93
+ puts "Resource URI: #{event.resource_uri}"
94
+ puts "State: #{event.state}"
95
+ puts "UUID: #{event.uuid}"
96
+ puts "Datetime: #{event.datetime}"
97
+ end
98
+
99
+ events.run! # This will start an EventMachine event loop
100
+
101
+ ```
102
+
103
+ ## Running specs
104
+
105
+ ```
106
+ rake spec
107
+ ```
108
+
109
+ if you are using docker compose then:
110
+
111
+ ```
112
+ docker-compose build
113
+ docker-compose run ruby_docker_cloud
71
114
  ```
72
115
 
73
116
  ## Contributing
@@ -78,4 +121,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/jntull
78
121
  ## License
79
122
 
80
123
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
81
-
@@ -0,0 +1,5 @@
1
+ ruby_docker_cloud:
2
+ build: .
3
+ command: bundle exec rake spec
4
+ volumes:
5
+ - .:/workspace
@@ -6,7 +6,7 @@ require 'docker_cloud/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'docker_cloud'
8
8
  spec.version = DockerCloud::VERSION
9
- spec.authors = ['Jillian Tullo']
9
+ spec.authors = ['Jillian Tullo', 'Richard Adams', 'Pat Leamon']
10
10
  spec.email = ['jillian.tullo@gmail.com']
11
11
 
12
12
  spec.summary = 'Ruby wrapper for the Docker Cloud HTTP REST API'
@@ -21,6 +21,8 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_runtime_dependency 'rest-client', '~> 1.8.0'
23
23
  spec.add_runtime_dependency 'json', '~> 1.8.1'
24
+ spec.add_runtime_dependency 'faye-websocket', '~> 0.10.3'
25
+
24
26
 
25
27
  spec.add_development_dependency 'codeclimate-test-reporter', '~> 0.4.1'
26
28
  spec.add_development_dependency 'rspec', '~> 3.1.0'
@@ -16,9 +16,11 @@ require 'docker_cloud/stack'
16
16
  require 'docker_cloud/node'
17
17
  require 'docker_cloud/node_cluster'
18
18
  require 'docker_cloud/service'
19
+ require 'docker_cloud/event'
19
20
 
20
21
  # api clients
21
22
  require 'docker_cloud/api/api'
23
+ require 'docker_cloud/api/stream_api'
22
24
  require 'docker_cloud/api/provider_api'
23
25
  require 'docker_cloud/api/region_api'
24
26
  require 'docker_cloud/api/availability_zone_api'
@@ -30,6 +32,7 @@ require 'docker_cloud/api/service_api'
30
32
  require 'docker_cloud/api/container_api'
31
33
  require 'docker_cloud/api/stack_api'
32
34
  require 'docker_cloud/api/registry_api'
35
+ require 'docker_cloud/api/events_api'
33
36
 
34
37
  # ruby libs
35
38
  require 'base64'
@@ -42,6 +45,7 @@ module DockerCloud
42
45
  INFRASTRUCTURE = 'infra'.freeze
43
46
  REPOSITORY = 'repo'.freeze
44
47
  APPLICATION = 'app'.freeze
48
+ AUDIT = 'audit'.freeze
45
49
  end
46
50
 
47
51
  def initialize(username, api_key)
@@ -102,12 +106,16 @@ module DockerCloud
102
106
  @containers ||= DockerCloud::ContainerAPI.new(headers, ApiType::APPLICATION, self)
103
107
  end
104
108
 
109
+ def events
110
+ @containers ||= DockerCloud::EventsAPI.new(headers, ApiType::AUDIT, self)
111
+ end
112
+
105
113
  private
106
114
 
107
115
  attr_reader :api_key
108
116
 
109
117
  def authorization
110
- @auth ||= "Basic #{Base64.strict_encode64(@username + ':' + api_key)}"
118
+ @auth ||= ENV['DOCKERCLOUD_AUTH'] || "Basic #{Base64.strict_encode64(@username + ':' + api_key)}"
111
119
  end
112
120
  end
113
121
  end
@@ -0,0 +1,31 @@
1
+ require 'faye/websocket'
2
+ require 'eventmachine'
3
+
4
+ module DockerCloud
5
+ class EventsAPI < DockerCloud::StreamAPI
6
+
7
+ private
8
+
9
+ def websocket_path
10
+ @websocket_path ||= '/events'.freeze
11
+ end
12
+
13
+ def _on_message(event)
14
+ @listeners[:message].call(convert_to_dockercloud_event(event)) if @listeners[:message]
15
+ end
16
+
17
+ def convert_to_dockercloud_event(original_event)
18
+ data = parse(original_event.data)
19
+ options = {
20
+ websocket_type: original_event.type,
21
+ bubbles: original_event.bubbles,
22
+ cancelable: original_event.cancelable,
23
+ target: original_event.target,
24
+ current_target: original_event.current_target,
25
+ event_phase: original_event.event_phase
26
+ }
27
+ DockerCloud::Event.new('message', options.merge(data))
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,84 @@
1
+ module DockerCloud
2
+ class StreamAPI < DockerCloud::API
3
+ STREAM_API_PATH = 'wss://ws.cloud.docker.com/api'.freeze
4
+
5
+ def websocket
6
+ @websocket ||= begin
7
+ url = URI.escape(STREAM_API_PATH + '/' + @type + '/' + API_VERSION + websocket_path)
8
+ Faye::WebSocket::Client.new(url, nil, ping: 240, headers: headers)
9
+ end
10
+ end
11
+
12
+ def on(type, &block)
13
+ @listeners = {} unless @listeners
14
+ @listeners[type.to_sym] = block
15
+ end
16
+
17
+ def run!(&block)
18
+ EventMachine.kqueue = true if EventMachine.kqueue?
19
+
20
+ EM.run {
21
+ @shutting_down = false
22
+ Signal.trap('INT') { signal_handler('INT') }
23
+ Signal.trap('TERM') { signal_handler('TERM') }
24
+
25
+ if block_given?
26
+ block.call
27
+ end
28
+
29
+ connect
30
+ }
31
+ end
32
+
33
+ private
34
+
35
+ def connect
36
+ websocket.on :open do |event|
37
+ _on_open(event)
38
+ end
39
+ websocket.on :message do |event|
40
+ _on_message(event)
41
+ end
42
+
43
+ websocket.on :error do |event|
44
+ _on_error(event)
45
+ end
46
+
47
+ websocket.on :close do |event|
48
+ _on_close(event)
49
+ end
50
+ end
51
+
52
+ def websocket_path
53
+ nil
54
+ end
55
+
56
+ def signal_handler(type)
57
+ # In rare cases the signal comes multiple times. If we're already shutting down ignore this.
58
+ unless @shutting_down
59
+ @shutting_down = true
60
+ EventMachine.stop
61
+ end
62
+ end
63
+
64
+ def _on_open(event)
65
+ @listeners[:open].call(event) if @listeners[:open]
66
+ end
67
+
68
+ def _on_message(event)
69
+ @listeners[:message].call(event) if @listeners[:message]
70
+ end
71
+
72
+ def _on_error(event)
73
+ @listeners[:error].call(event) if @listeners[:error]
74
+ end
75
+
76
+ def _on_close(event)
77
+ @listeners[:close].call(event) if @listeners[:close]
78
+ unless @shutting_down
79
+ connect
80
+ end
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,8 @@
1
+ require 'faye/websocket'
2
+ require 'faye/websocket/api/event'
3
+
4
+ module DockerCloud
5
+ class Event < Faye::WebSocket::API::MessageEvent
6
+ attr_reader :action, :parents, :resource_uri, :state, :uuid, :datetime
7
+ end
8
+ end
@@ -1,3 +1,3 @@
1
1
  module DockerCloud
2
- VERSION = '0.1.3'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docker_cloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jillian Tullo
8
+ - Richard Adams
9
+ - Pat Leamon
8
10
  autorequire:
9
11
  bindir: exe
10
12
  cert_chain: []
11
- date: 2016-03-30 00:00:00.000000000 Z
13
+ date: 2016-04-15 00:00:00.000000000 Z
12
14
  dependencies:
13
15
  - !ruby/object:Gem::Dependency
14
16
  name: rest-client
@@ -38,6 +40,20 @@ dependencies:
38
40
  - - "~>"
39
41
  - !ruby/object:Gem::Version
40
42
  version: 1.8.1
43
+ - !ruby/object:Gem::Dependency
44
+ name: faye-websocket
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: 0.10.3
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: 0.10.3
41
57
  - !ruby/object:Gem::Dependency
42
58
  name: codeclimate-test-reporter
43
59
  requirement: !ruby/object:Gem::Requirement
@@ -134,15 +150,18 @@ files:
134
150
  - ".rubocop.yml"
135
151
  - ".travis.yml"
136
152
  - CODE_OF_CONDUCT.md
153
+ - Dockerfile
137
154
  - Gemfile
138
155
  - LICENSE.txt
139
156
  - README.md
140
157
  - Rakefile
158
+ - docker-compose.yml
141
159
  - docker_cloud.gemspec
142
160
  - lib/docker_cloud.rb
143
161
  - lib/docker_cloud/api/api.rb
144
162
  - lib/docker_cloud/api/availability_zone_api.rb
145
163
  - lib/docker_cloud/api/container_api.rb
164
+ - lib/docker_cloud/api/events_api.rb
146
165
  - lib/docker_cloud/api/external_repository_api.rb
147
166
  - lib/docker_cloud/api/node_api.rb
148
167
  - lib/docker_cloud/api/node_cluster_api.rb
@@ -152,8 +171,10 @@ files:
152
171
  - lib/docker_cloud/api/registry_api.rb
153
172
  - lib/docker_cloud/api/service_api.rb
154
173
  - lib/docker_cloud/api/stack_api.rb
174
+ - lib/docker_cloud/api/stream_api.rb
155
175
  - lib/docker_cloud/availability_zone.rb
156
176
  - lib/docker_cloud/container.rb
177
+ - lib/docker_cloud/event.rb
157
178
  - lib/docker_cloud/external_repository.rb
158
179
  - lib/docker_cloud/helpers/api.rb
159
180
  - lib/docker_cloud/helpers/services.rb