docker-swarm-api 1.1 → 1.2

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: 04b3f0bbdfe51472c479d55d01b295dd1fbd700a
4
- data.tar.gz: ea9e5330f567696ad9e3feae4fd49c809502cb5a
3
+ metadata.gz: 7be7483768fca3556ef820aede393f082ea9112d
4
+ data.tar.gz: 46d6a6c0831df578aef01dd6ced0c6d38f79ef84
5
5
  SHA512:
6
- metadata.gz: 605b03b067f0762243ff3cd7942c48313918550ec7589b2c0a43c0644ec08cbd46f6b56c77183643d5bbb4033ab660b3256b26f03ee6e5420eca6e4d494c9f42
7
- data.tar.gz: 01d83aaa468cfc32fcadc2e570407565ce26affec0983ce579c3eb47cb14945e2546973cd23b66012bdf34b41a1656a4063107677a6ebc8406b0941402cd64fe
6
+ metadata.gz: da9b11be6fb1cd7dd935e04779cc7f4c05fb05ee48def067d4f7d64017f1278483106a5e0ee984a7ab50897197821da4af0b9090d7808800ed092c2f784602d6
7
+ data.tar.gz: e231e65865010eea0be3b362a50a9d3ba28825aeda8d269eb84b67a99c18dca93aa9fcf52d8544f5ae1caf5ee955679e47d8ab21343e92cafcbc1aafc4ad8aec
@@ -45,8 +45,24 @@ class Docker::Swarm::Node
45
45
  return @hash['Status']['State']
46
46
  end
47
47
 
48
- def drain
48
+ def drain(opts = {})
49
49
  change_availability(:drain)
50
+ if (opts[:wait_for_drain])
51
+ opts[:wait_seconds]
52
+ while (running_tasks.length > 0)
53
+ puts "Waiting for node (#{host_name}) to drain. Still has #{running_tasks.length} tasks running."
54
+ end
55
+ end
56
+ end
57
+
58
+ def running_tasks
59
+ return tasks.select {|t| t.status == 'running'}
60
+ end
61
+
62
+ def tasks
63
+ return @swarm.tasks.select {|t|
64
+ t.node.id == self.id
65
+ }
50
66
  end
51
67
 
52
68
  def activate
@@ -54,19 +70,41 @@ class Docker::Swarm::Node
54
70
  end
55
71
 
56
72
  def remove
57
- Docker::Swarm::Node.remove(id(), @connection)
73
+ leave(true)
74
+ refresh
75
+ start_time = Time.now
76
+ while (self.status != 'down')
77
+ refresh
78
+ raise "Node not down 60 seconds after leaving swarm: #{self.host_name}" if (Time.now.to_i - start_time.to_i > 60)
79
+ end
80
+ Docker::Swarm::Node.remove(self.id, @swarm.connection)
58
81
  end
59
82
 
60
- def change_availability(availability)
83
+ def leave(force = true)
84
+ drain(wait_for_drain: true, wait_seconds: 60)
85
+ # change_availability(:active)
86
+ @swarm.leave(self, force)
87
+ end
88
+
89
+ def change_availability(new_availability)
61
90
  raise "Bad availability param: #{availability}" if (!AVAILABILITY[availability])
62
- @hash['Spec']['Availability'] = AVAILABILITY[availability]
63
- query = {version: @hash['Version']['Index']}
64
- response = @swarm.connection.post("/nodes/#{self.id}/update", query, :body => @hash['Spec'].to_json)
91
+ refresh
92
+ if (self.availability != new_availability)
93
+ @hash['Spec']['Availability'] = AVAILABILITY[new_availability]
94
+ query = {version: @hash['Version']['Index']}
95
+ response = @swarm.connection.post("/nodes/#{self.id}/update", query, :body => @hash['Spec'].to_json, expects: [200, 500], full_response: true)
96
+ if (response.status != 200)
97
+ raise "Error changing node availability: #{response.body} HTTP-#{response.status}"
98
+ end
99
+ end
65
100
  end
66
101
 
67
- def remove
102
+ def self.remove(node_id, connection)
68
103
  query = {}
69
- response = @swarm.connection.delete("/nodes/#{self.id}", query, expects: [200, 406])
104
+ response = connection.delete("/nodes/#{node_id}", query, expects: [200, 406, 500], full_response: true)
105
+ if (response.status != 200)
106
+ raise "Error deleting node: #{response.body}"
107
+ end
70
108
  end
71
109
 
72
110
 
@@ -7,12 +7,16 @@ class Docker::Swarm::Swarm
7
7
 
8
8
  def initialize(hash, manager_connection)
9
9
  @hash = hash
10
+ # @manager_connection = manager_connection
10
11
  @id = hash['ID']
11
12
  @worker_join_token = hash['JoinTokens']['Worker']
12
13
  @manager_join_token = hash['JoinTokens']['Manager']
13
- manager_node = nodes(manager_connection).first
14
14
  @node_hash = {}
15
- @node_hash[manager_node.id] = {hash: manager_node.hash, connection: manager_connection}
15
+ nodes(manager_connection).each do |node|
16
+ # Resolv::DNS.new.getaddress("devlog")
17
+ @node_hash[node.id] = {hash: node.hash, connection: manager_connection}
18
+
19
+ end
16
20
  end
17
21
 
18
22
  def join(node_connection, join_token)
@@ -26,12 +30,15 @@ class Docker::Swarm::Swarm
26
30
  "RemoteAddrs" => ["#{master_ip}:2377"],
27
31
  "JoinToken" => join_token
28
32
  }
33
+ new_node = nil
29
34
  resp = node_connection.post('/swarm/join', query, :body => join_options.to_json, expects: [200])
30
35
  nodes.each do |node|
31
36
  if (!node_ids_before.include? node.id)
37
+ new_node = node
32
38
  @node_hash[node.id] = {hash: node.hash, connection: node_connection}
33
39
  end
34
40
  end
41
+ return new_node
35
42
  end
36
43
 
37
44
  def connection
@@ -41,7 +48,7 @@ class Docker::Swarm::Swarm
41
48
  return node_info[:connection]
42
49
  end
43
50
  end
44
- raise "No manager connection found for swarm"
51
+ return @manager_connection
45
52
  end
46
53
 
47
54
  def join_worker(node_connection)
@@ -53,6 +60,10 @@ class Docker::Swarm::Swarm
53
60
  end
54
61
 
55
62
  def remove
63
+ services().each do |service|
64
+ service.remove()
65
+ end
66
+
56
67
  worker_nodes.each do |node|
57
68
  leave(node, true)
58
69
  end
@@ -138,7 +149,18 @@ class Docker::Swarm::Swarm
138
149
  hash = JSON.parse(response)
139
150
  return Docker::Swarm::Service.new(self, hash)
140
151
  end
141
-
152
+
153
+ def services
154
+ items = []
155
+ query = {}
156
+ opts = {}
157
+ response = self.connection.get("/services", query, :body => opts.to_json)
158
+ hashes = JSON.parse(response)
159
+ hashes.each do |hash|
160
+ items << Docker::Swarm::Service.new(self, hash)
161
+ end
162
+ return items
163
+ end
142
164
 
143
165
  # Initialize Swarm
144
166
  def self.init(opts, connection)
@@ -164,9 +186,19 @@ class Docker::Swarm::Swarm
164
186
  def self.leave(force, connection)
165
187
  query = {}
166
188
  query['force'] = force
167
- connection.post('/swarm/leave', query, expects: [200, 406])
189
+ response = connection.post('/swarm/leave', query, expects: [200, 406, 500], full_response: true)
190
+ if (response.status == 500)
191
+ raise "Error leaving: #{response.body} HTTP-#{response.status}"
192
+ end
168
193
  end
169
194
 
195
+ def self.find(connection)
196
+ query = {}
197
+ response = connection.get('/swarm', query, expects: [200, 406], full_response: true)
198
+ if (response.status == 200)
199
+ return Docker::Swarm::Swarm.new(JSON.parse(response.body), connection)
200
+ end
201
+ end
170
202
 
171
203
 
172
204
  end
@@ -24,6 +24,10 @@ class Docker::Swarm::Task
24
24
  @hash['NodeID']
25
25
  end
26
26
 
27
+ def node
28
+ return @swarm.nodes.find {|n| n.id == self.node_id}
29
+ end
30
+
27
31
  def created_at
28
32
  return DateTime.parse(@hash.first['CreatedAt'])
29
33
  end
@@ -1,7 +1,7 @@
1
1
  module Docker
2
2
  module Swarm
3
3
  # The version of the docker-api gem.
4
- VERSION = '1.1'
4
+ VERSION = '1.2'
5
5
 
6
6
  # The version of the compatible Docker remote API.
7
7
  API_VERSION = '1.24'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docker-swarm-api
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.1'
4
+ version: '1.2'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Moore / Rogue Wave Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-23 00:00:00.000000000 Z
11
+ date: 2016-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -39,33 +39,33 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.33.1
41
41
  - !ruby/object:Gem::Dependency
42
- name: byebug
42
+ name: retry_block
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '6.0'
48
- type: :development
47
+ version: '0'
48
+ type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '6.0'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: retry_block
56
+ name: byebug
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '6.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '6.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement