docker-swarm-sdk 1.2.6 → 1.2.7
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.
- checksums.yaml +4 -4
- data/README.md +4 -1
- data/lib/docker/swarm/service.rb +21 -12
- data/lib/docker/swarm/swarm.rb +40 -39
- data/lib/docker/swarm/task.rb +16 -8
- data/lib/docker/swarm/version.rb +2 -2
- metadata +31 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80ce05c3772a87ef6d5ac0535192fa4d4fc9eaab
|
4
|
+
data.tar.gz: fb89cd6b07981d2f8d949bfcc8dc2e1be051528b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47f1523152677724924eda382cb0451bfa83a347845d612654ec00ea22e33836344087de47bac60ea43f23d787c0a9b88a13790fc3ae0c720434713256eba62e
|
7
|
+
data.tar.gz: fc1c34a42182692424913556f99ff0d7cca3328eede7b201ed731daed9fc3f1d3e589cba7ad6976993a0a2adec0b61bef01f708528e368e31606739c24b5a75f
|
data/README.md
CHANGED
@@ -19,6 +19,9 @@ Sample Usage
|
|
19
19
|
# Make a connection to the Swarm manager's API. (Assumes port 2375 exposed for API)
|
20
20
|
master_connection = Docker::Swarm::Connection.new('http://10.20.30.1:2375')
|
21
21
|
|
22
|
+
# If swarm on the swarm master and using socket:
|
23
|
+
master_connection = Docker::Swarm::Connection.new('unix:///var/run/docker.sock')
|
24
|
+
|
22
25
|
# Manager node intializes swarm
|
23
26
|
swarm_init_options = { "ListenAddr" => "0.0.0.0:2377" }
|
24
27
|
swarm = Docker::Swarm::Swarm.init(swarm_init_options, master_connection)
|
@@ -90,7 +93,7 @@ tasks = swarm.tasks()
|
|
90
93
|
|
91
94
|
# Scale up or down the number of replicas on a service
|
92
95
|
service.scale(20)
|
93
|
-
|
96
|
+
|
94
97
|
# Worker leaves the swarm - no forcing
|
95
98
|
swarm.leave(worker_node, node)
|
96
99
|
|
data/lib/docker/swarm/service.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'docker-api'
|
2
|
+
require 'active_support'
|
2
3
|
|
3
4
|
class Docker::Swarm::Service
|
4
|
-
#include Docker::Base
|
5
5
|
attr_reader :hash
|
6
6
|
|
7
7
|
def initialize(swarm, hash)
|
8
8
|
@swarm = swarm
|
9
9
|
@hash = hash
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def name()
|
13
13
|
@hash['Spec']['Name']
|
14
14
|
end
|
@@ -16,13 +16,13 @@ class Docker::Swarm::Service
|
|
16
16
|
def id()
|
17
17
|
return @hash['ID']
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def reload()
|
21
21
|
s = @swarm.find_service(id())
|
22
22
|
@hash = s.hash
|
23
23
|
return self
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def network_ids
|
27
27
|
network_ids = []
|
28
28
|
if (@hash['Endpoint']['VirtualIPs'])
|
@@ -32,16 +32,23 @@ class Docker::Swarm::Service
|
|
32
32
|
end
|
33
33
|
return network_ids
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def remove(opts = {})
|
37
37
|
query = {}
|
38
38
|
@swarm.connection.delete("/services/#{self.id}", query, :body => opts.to_json)
|
39
39
|
end
|
40
|
-
|
41
|
-
def update(
|
40
|
+
|
41
|
+
def update(options = {})
|
42
|
+
specs = @hash['Spec'].deep_merge(options)
|
42
43
|
query = {}
|
43
44
|
version = @hash['Version']['Index']
|
44
|
-
response = @swarm.connection.post("/services/#{self.id}/update?version=#{version}", query, :body =>
|
45
|
+
response = @swarm.connection.post("/services/#{self.id}/update?version=#{version}", query, :body => specs.to_json)
|
46
|
+
end
|
47
|
+
|
48
|
+
def restart
|
49
|
+
options = {}
|
50
|
+
options['TaskTemplate'] = {'ForceUpdate' => 1}
|
51
|
+
update(options)
|
45
52
|
end
|
46
53
|
|
47
54
|
def scale(count)
|
@@ -49,6 +56,10 @@ class Docker::Swarm::Service
|
|
49
56
|
self.update(@hash['Spec'])
|
50
57
|
end
|
51
58
|
|
59
|
+
def replicas
|
60
|
+
@hash['Spec']['Mode']['Replicated']['Replicas']
|
61
|
+
end
|
62
|
+
|
52
63
|
def self.DEFAULT_OPTIONS
|
53
64
|
default_service_create_options = {
|
54
65
|
"Name" => "<<Required>>",
|
@@ -73,7 +84,7 @@ class Docker::Swarm::Service
|
|
73
84
|
},
|
74
85
|
"Reservations" => {
|
75
86
|
# "NanoCPUs" => ?
|
76
|
-
# MemoryBytes =>
|
87
|
+
# MemoryBytes =>
|
77
88
|
}
|
78
89
|
},
|
79
90
|
"RestartPolicy" => {
|
@@ -107,6 +118,4 @@ class Docker::Swarm::Service
|
|
107
118
|
}
|
108
119
|
return default_service_create_options
|
109
120
|
end
|
110
|
-
|
111
|
-
|
112
|
-
end
|
121
|
+
end
|
data/lib/docker/swarm/swarm.rb
CHANGED
@@ -8,8 +8,8 @@ class Docker::Swarm::Swarm
|
|
8
8
|
attr_reader :node_ip, :manager_ip, :worker_join_token, :manager_join_token, :id, :hash, :node_hash
|
9
9
|
|
10
10
|
def store_manager(manager_connection, listen_address_and_port)
|
11
|
-
node = nodes.find {|n|
|
12
|
-
(n.hash['ManagerStatus']) && (n.hash['ManagerStatus']['Leader'] == true) && (n.hash['ManagerStatus']['Addr'] == listen_address_and_port)
|
11
|
+
node = nodes.find {|n|
|
12
|
+
(n.hash['ManagerStatus']) && (n.hash['ManagerStatus']['Leader'] == true) && (n.hash['ManagerStatus']['Addr'] == listen_address_and_port)
|
13
13
|
}
|
14
14
|
raise "Node not found for: #{listen_address}" if (!node)
|
15
15
|
@node_hash[node.id] = {hash: node.hash, connection: manager_connection}
|
@@ -18,7 +18,7 @@ class Docker::Swarm::Swarm
|
|
18
18
|
def update_data(hash)
|
19
19
|
@hash = hash
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def socket_connection(node_connection)
|
23
23
|
node_connection.url.include?('unix:///')
|
24
24
|
end
|
@@ -32,7 +32,7 @@ class Docker::Swarm::Swarm
|
|
32
32
|
node_ip = node_connection.url.split("//").last.split(":").first
|
33
33
|
manager_ip = self.connection.url.split("//").last.split(":").first
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
join_options = {
|
37
37
|
"ListenAddr" => "#{listen_address}",
|
38
38
|
"AdvertiseAddr" => "#{node_ip}:2377",
|
@@ -62,11 +62,11 @@ class Docker::Swarm::Swarm
|
|
62
62
|
def join_worker(node_connection, listen_address = "0.0.0.0:2377")
|
63
63
|
join(node_connection, @node_ip, @manager_ip, @worker_join_token)
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
def join_manager(node_connection, listen_address = "0.0.0.0:2377")
|
67
67
|
join(node_connection, @node_ip, @manager_ip, @manager_join_token, listen_address)
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
def connection
|
71
71
|
@node_hash.keys.each do |node_id|
|
72
72
|
node_info = @node_hash[node_id]
|
@@ -81,7 +81,7 @@ class Docker::Swarm::Swarm
|
|
81
81
|
services().each do |service|
|
82
82
|
service.remove()
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
worker_nodes.each do |node|
|
86
86
|
leave(node, true)
|
87
87
|
end
|
@@ -89,7 +89,7 @@ class Docker::Swarm::Swarm
|
|
89
89
|
leave(node, true)
|
90
90
|
end
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
def tasks
|
94
94
|
items = []
|
95
95
|
query = {}
|
@@ -109,11 +109,11 @@ class Docker::Swarm::Swarm
|
|
109
109
|
Docker::Swarm::Swarm.leave(force, node_info[:connection])
|
110
110
|
end
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
def remove_node(worker_node)
|
114
114
|
Swarm::Node.remove(worker_node.id, self.connection)
|
115
115
|
end
|
116
|
-
|
116
|
+
|
117
117
|
def manager_nodes
|
118
118
|
return nodes.select { |node| node.role == :manager} || []
|
119
119
|
end
|
@@ -121,7 +121,7 @@ class Docker::Swarm::Swarm
|
|
121
121
|
def worker_nodes
|
122
122
|
return nodes.select { |node| node.role == :worker} || []
|
123
123
|
end
|
124
|
-
|
124
|
+
|
125
125
|
def networks
|
126
126
|
all_networks = []
|
127
127
|
response = connection.get("/networks", {}, full_response: true)
|
@@ -135,7 +135,7 @@ class Docker::Swarm::Swarm
|
|
135
135
|
end
|
136
136
|
return all_networks
|
137
137
|
end
|
138
|
-
|
138
|
+
|
139
139
|
def create_network(options)
|
140
140
|
response = connection.post('/networks/create', {}, body: options.to_json, expects: [200, 201, 500], full_response: true)
|
141
141
|
if (response.status <= 201)
|
@@ -148,11 +148,11 @@ class Docker::Swarm::Swarm
|
|
148
148
|
raise "Error creating network: HTTP-#{response.status} - #{response.body}"
|
149
149
|
end
|
150
150
|
end
|
151
|
-
|
151
|
+
|
152
152
|
def create_network_overlay(network_name)
|
153
153
|
subnet_16_parts = [10, 10, 0, 0]
|
154
154
|
max_vxlanid = 200
|
155
|
-
|
155
|
+
|
156
156
|
# Sometimes nodes have leftover networks not on other nodes, that have subnets that can't be duplicated in
|
157
157
|
# the new overlay network.
|
158
158
|
nodes.each do |node|
|
@@ -165,7 +165,7 @@ class Docker::Swarm::Swarm
|
|
165
165
|
end
|
166
166
|
end
|
167
167
|
end
|
168
|
-
|
168
|
+
|
169
169
|
# Make sure our new network doesn't duplicate subnet of other network.
|
170
170
|
if (network.hash['IPAM']) && (network.hash['IPAM']['Config'])
|
171
171
|
network.hash['IPAM']['Config'].each do |subnet_config|
|
@@ -189,7 +189,7 @@ class Docker::Swarm::Swarm
|
|
189
189
|
end
|
190
190
|
end
|
191
191
|
end
|
192
|
-
|
192
|
+
|
193
193
|
|
194
194
|
options = {
|
195
195
|
"Name" => network_name,
|
@@ -218,7 +218,7 @@ class Docker::Swarm::Swarm
|
|
218
218
|
}
|
219
219
|
create_network(options)
|
220
220
|
end
|
221
|
-
|
221
|
+
|
222
222
|
# Return all of the Nodes.
|
223
223
|
def nodes
|
224
224
|
opts = {}
|
@@ -249,7 +249,7 @@ class Docker::Swarm::Swarm
|
|
249
249
|
end
|
250
250
|
return nil
|
251
251
|
end
|
252
|
-
|
252
|
+
|
253
253
|
def find_service(id)
|
254
254
|
query = {}
|
255
255
|
opts = {}
|
@@ -257,14 +257,14 @@ class Docker::Swarm::Swarm
|
|
257
257
|
hash = JSON.parse(response)
|
258
258
|
return Docker::Swarm::Service.new(self, hash)
|
259
259
|
end
|
260
|
-
|
260
|
+
|
261
261
|
def find_service_by_name(name)
|
262
262
|
services.each do |service|
|
263
263
|
return service if (service.name == name)
|
264
264
|
end
|
265
265
|
return nil
|
266
266
|
end
|
267
|
-
|
267
|
+
|
268
268
|
def services
|
269
269
|
items = []
|
270
270
|
query = {}
|
@@ -276,17 +276,18 @@ class Docker::Swarm::Swarm
|
|
276
276
|
end
|
277
277
|
return items
|
278
278
|
end
|
279
|
-
|
280
|
-
|
279
|
+
|
280
|
+
|
281
281
|
# Initialize Swarm
|
282
282
|
def self.init(opts, connection)
|
283
283
|
query = {}
|
284
284
|
resp = connection.post('/swarm/init', query, :body => opts.to_json, full_response: true, expects: [200, 404, 406, 500])
|
285
285
|
if (resp.status == 200)
|
286
286
|
swarm = Docker::Swarm::Swarm.swarm(opts, connection)
|
287
|
-
manager_node = swarm.nodes.find {|n|
|
288
|
-
(n.hash['ManagerStatus']) && (n.hash['ManagerStatus']['Leader'] == true)
|
287
|
+
manager_node = swarm.nodes.find {|n|
|
288
|
+
(n.hash['ManagerStatus']) && (n.hash['ManagerStatus']['Leader'] == true)
|
289
289
|
}
|
290
|
+
byebug
|
290
291
|
listen_address = manager_node.hash['ManagerStatus']['Addr']
|
291
292
|
swarm.store_manager(connection, listen_address)
|
292
293
|
return swarm
|
@@ -296,14 +297,14 @@ class Docker::Swarm::Swarm
|
|
296
297
|
end
|
297
298
|
|
298
299
|
# docker swarm join-token -q worker
|
299
|
-
def self.swarm(
|
300
|
+
def self.swarm(connection, options = {})
|
300
301
|
query = {}
|
301
302
|
resp = connection.get('/swarm', query, :body => options.to_json, expects: [200, 404, 406], full_response: true)
|
302
303
|
if (resp.status == 406) || (resp.status == 404)
|
303
304
|
return nil
|
304
305
|
elsif (resp.status == 200)
|
305
306
|
hash = JSON.parse(resp.body)
|
306
|
-
swarm = self.find_swarm_for_id(hash['ID'])
|
307
|
+
swarm = self.find_swarm_for_id(hash['ID'])
|
307
308
|
if (swarm)
|
308
309
|
swarm.update_data(hash)
|
309
310
|
else
|
@@ -313,7 +314,7 @@ class Docker::Swarm::Swarm
|
|
313
314
|
raise "Bad response: #{resp.status} #{resp.body}"
|
314
315
|
end
|
315
316
|
end
|
316
|
-
|
317
|
+
|
317
318
|
def self.leave(force, connection)
|
318
319
|
query = {}
|
319
320
|
query['force'] = force
|
@@ -322,39 +323,39 @@ class Docker::Swarm::Swarm
|
|
322
323
|
raise "Error leaving: #{response.body} HTTP-#{response.status}"
|
323
324
|
end
|
324
325
|
end
|
325
|
-
|
326
|
+
|
326
327
|
def self.find(connection, options = {})
|
327
328
|
query = {}
|
328
329
|
response = connection.get('/swarm', query, expects: [200, 404, 406], full_response: true)
|
329
330
|
if (response.status == 200)
|
330
331
|
hash = JSON.parse(response.body)
|
331
|
-
swarm = self.find_swarm_for_id(hash['ID'])
|
332
|
+
swarm = self.find_swarm_for_id(hash['ID'])
|
332
333
|
if (swarm)
|
333
334
|
swarm.update_data(hash)
|
334
335
|
else
|
335
336
|
swarm = Docker::Swarm::Swarm.new(hash, connection, options)
|
336
337
|
end
|
337
|
-
manager_node = swarm.nodes.find {|n|
|
338
|
-
(n.hash['ManagerStatus']) && (n.hash['ManagerStatus']['Leader'] == true)
|
338
|
+
manager_node = swarm.nodes.find {|n|
|
339
|
+
(n.hash['ManagerStatus']) && (n.hash['ManagerStatus']['Leader'] == true)
|
339
340
|
}
|
340
341
|
listen_address = manager_node.hash['ManagerStatus']['Addr']
|
341
342
|
swarm.store_manager(connection, listen_address)
|
342
343
|
return swarm
|
343
344
|
elsif (response.status > 200)
|
344
345
|
return nil
|
345
|
-
else
|
346
|
+
else
|
346
347
|
raise "Error finding swarm: HTTP-#{response.status} #{response.body}"
|
347
348
|
end
|
348
349
|
end
|
349
|
-
|
350
|
-
|
350
|
+
|
351
|
+
|
351
352
|
private
|
352
353
|
@@swarms = {}
|
353
|
-
|
354
|
+
|
354
355
|
def self.find_swarm_for_id(swarm_id)
|
355
356
|
return @@swarms[swarm_id]
|
356
357
|
end
|
357
|
-
|
358
|
+
|
358
359
|
def initialize(hash, manager_connection = nil, options = {})
|
359
360
|
@hash = hash
|
360
361
|
@id = hash['ID']
|
@@ -366,8 +367,8 @@ class Docker::Swarm::Swarm
|
|
366
367
|
@manager_connection = manager_connection
|
367
368
|
@@swarms[@id] = self
|
368
369
|
end
|
369
|
-
|
370
|
-
|
371
|
-
|
370
|
+
|
371
|
+
|
372
|
+
|
372
373
|
|
373
374
|
end
|
data/lib/docker/swarm/task.rb
CHANGED
@@ -7,19 +7,19 @@ class Docker::Swarm::Task
|
|
7
7
|
@hash = hash
|
8
8
|
@swarm = swarm
|
9
9
|
end
|
10
|
-
|
11
|
-
def id
|
10
|
+
|
11
|
+
def id
|
12
12
|
return @hash['ID']
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def image
|
16
16
|
return @hash['Spec']['ContainerSpec']['Image']
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def service_id
|
20
20
|
@hash['ServiceID']
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def service
|
24
24
|
return @swarm.services.find { |service|
|
25
25
|
self.service_id == service.id
|
@@ -29,19 +29,27 @@ class Docker::Swarm::Task
|
|
29
29
|
def node_id
|
30
30
|
@hash['NodeID']
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def node
|
34
34
|
return @swarm.nodes.find {|n| n.id == self.node_id}
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def created_at
|
38
38
|
return DateTime.parse(@hash.first['CreatedAt'])
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def status
|
42
42
|
@hash['Status']['State'].to_sym
|
43
43
|
end
|
44
44
|
|
45
|
+
def status_timestamp
|
46
|
+
return DateTime.parse(@hash['Status']['Timestamp'])
|
47
|
+
end
|
48
|
+
|
49
|
+
def status_message
|
50
|
+
@hash['Status']['Message']
|
51
|
+
end
|
52
|
+
|
45
53
|
def networks
|
46
54
|
all_networks = @swarm.networks
|
47
55
|
nets = []
|
data/lib/docker/swarm/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docker-swarm-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Moore
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06
|
11
|
+
date: 2017-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 1.2.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: activesupport
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '5.0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '5.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: byebug
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '6.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '6.0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: rake
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -177,5 +205,5 @@ rubyforge_project:
|
|
177
205
|
rubygems_version: 2.6.12
|
178
206
|
signing_key:
|
179
207
|
specification_version: 4
|
180
|
-
summary: Ruby
|
208
|
+
summary: Ruby API for Docker Swarm
|
181
209
|
test_files: []
|