docker-swarm-api 1.2.1 → 1.2.2
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 +6 -0
- data/lib/docker-swarm-api.rb +1 -1
- data/lib/docker-swarm.rb +12 -6
- data/lib/docker/swarm/connection.rb +0 -45
- data/lib/docker/swarm/network.rb +51 -11
- data/lib/docker/swarm/node.rb +1 -1
- data/lib/docker/swarm/service.rb +12 -0
- data/lib/docker/swarm/swarm.rb +87 -9
- data/lib/docker/swarm/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a8630271a889f20bc866426d01c86a9892e6fbe
|
4
|
+
data.tar.gz: 41d722648cf609db8f83da1e27715cd7f519040f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c84719528dfc669814d3444647fb96b052da5a61be9480dbbb68992e6309e80ba1f34db7c7606c0144a3c8ff5fa5c76178676c35c20f81916a6c646373c6a6a
|
7
|
+
data.tar.gz: 430e4921e366265643d67c917b77b4c97b7f8ce71d4216a352ea3fc2e5db6513f3f11a947d39c95e583e81072d4cdcf888bfbb5348353cef535314508241ed38
|
data/README.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# docker-swarm-api
|
2
2
|
|
3
|
+
Must use Docker API Version of 1.24 or above.
|
4
|
+
|
5
|
+
This project leverages swipely/docker-api, and adds Docker Swarm capability.
|
6
|
+
|
7
|
+
Warning: cannot create overlay network in Docker Engine versions less than 1.13.
|
8
|
+
|
3
9
|
Sample Usage
|
4
10
|
------------
|
5
11
|
```ruby
|
data/lib/docker-swarm-api.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
require_relative './docker-swarm'
|
data/lib/docker-swarm.rb
CHANGED
@@ -22,12 +22,18 @@ module Docker
|
|
22
22
|
module Swarm
|
23
23
|
attr_accessor :creds, :logger
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
require_relative './docker/swarm/node'
|
26
|
+
require_relative './docker/swarm/service'
|
27
|
+
require_relative './docker/swarm/swarm'
|
28
|
+
require_relative './docker/swarm/connection'
|
29
|
+
require_relative './docker/swarm/network'
|
30
|
+
require_relative './docker/swarm/task'
|
31
|
+
# require 'docker/swarm/node'
|
32
|
+
# require 'docker/swarm/service'
|
33
|
+
# require 'docker/swarm/swarm'
|
34
|
+
# require 'docker/swarm/connection'
|
35
|
+
# require 'docker/swarm/network'
|
36
|
+
# require 'docker/swarm/task'
|
31
37
|
|
32
38
|
def default_socket_url
|
33
39
|
'unix:///var/run/docker.sock'
|
@@ -6,13 +6,6 @@ class Docker::Swarm::Connection < Docker::Connection
|
|
6
6
|
super(url, opts)
|
7
7
|
end
|
8
8
|
|
9
|
-
#
|
10
|
-
# # The actual client that sends HTTP methods to the Docker server. This value
|
11
|
-
# # is not cached, since doing so may cause socket errors after bad requests.
|
12
|
-
# def resource
|
13
|
-
# Excon.new(url, options)
|
14
|
-
# end
|
15
|
-
# private :resource
|
16
9
|
|
17
10
|
# Send a request to the server with the `
|
18
11
|
def request(*args, &block)
|
@@ -25,42 +18,4 @@ class Docker::Swarm::Connection < Docker::Connection
|
|
25
18
|
end
|
26
19
|
end
|
27
20
|
|
28
|
-
# def log_request(request)
|
29
|
-
# if Docker.logger
|
30
|
-
# Docker.logger.debug(
|
31
|
-
# [request[:method], request[:path], request[:query], request[:body]]
|
32
|
-
# )
|
33
|
-
# end
|
34
|
-
# end
|
35
|
-
|
36
|
-
# # Delegate all HTTP methods to the #request.
|
37
|
-
# [:get, :put, :post, :delete].each do |method|
|
38
|
-
# define_method(method) { |*args, &block| request(method, *args, &block) }
|
39
|
-
# end
|
40
|
-
#
|
41
|
-
# def to_s
|
42
|
-
# "Docker::Connection { :url => #{url}, :options => #{options} }"
|
43
|
-
# end
|
44
|
-
#
|
45
|
-
# private
|
46
|
-
# # Given an HTTP method, path, optional query, extra options, and block,
|
47
|
-
# # compiles a request.
|
48
|
-
# def compile_request_params(http_method, path, query = nil, opts = nil, &block)
|
49
|
-
# query ||= {}
|
50
|
-
# opts ||= {}
|
51
|
-
# headers = opts.delete(:headers) || {}
|
52
|
-
# content_type = opts[:body].nil? ? 'text/plain' : 'application/json'
|
53
|
-
# user_agent = "Swipely/Docker-API #{Docker::VERSION}"
|
54
|
-
# {
|
55
|
-
# :method => http_method,
|
56
|
-
# :path => "/v#{Docker::API_VERSION}#{path}",
|
57
|
-
# :query => query,
|
58
|
-
# :headers => { 'Content-Type' => content_type,
|
59
|
-
# 'User-Agent' => user_agent,
|
60
|
-
# }.merge(headers),
|
61
|
-
# :expects => (200..204).to_a << 301 << 304,
|
62
|
-
# :idempotent => http_method == :get,
|
63
|
-
# :request_block => block,
|
64
|
-
# }.merge(opts).reject { |_, v| v.nil? }
|
65
|
-
# end
|
66
21
|
end
|
data/lib/docker/swarm/network.rb
CHANGED
@@ -1,16 +1,56 @@
|
|
1
1
|
require 'docker-api'
|
2
2
|
|
3
|
-
class Docker::Swarm::Network
|
4
|
-
|
3
|
+
class Docker::Swarm::Network
|
4
|
+
attr_reader :hash
|
5
|
+
|
6
|
+
def initialize(swarm, hash)
|
7
|
+
@hash = hash
|
8
|
+
@swarm = swarm
|
9
|
+
end
|
10
|
+
|
11
|
+
def connection
|
12
|
+
return @swarm.connection
|
13
|
+
end
|
14
|
+
|
15
|
+
def id
|
16
|
+
return @hash['Id']
|
17
|
+
end
|
18
|
+
|
19
|
+
def name
|
20
|
+
return @hash['Name']
|
21
|
+
end
|
5
22
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
if (network.info['Name'] == network_name)
|
11
|
-
return network
|
12
|
-
end
|
23
|
+
def remove
|
24
|
+
response = @swarm.connection.delete("/networks/#{id()}", {}, expects: [200, 204, 500], full_response: true)
|
25
|
+
if (response.status > 204)
|
26
|
+
raise "Error deleting network (#{name}) HTTP-#{response.status} #{response.body}"
|
13
27
|
end
|
14
|
-
return nil
|
15
28
|
end
|
16
|
-
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
# EXAMPLE INSPECT OF OVERLAY NETWORK:
|
33
|
+
# {
|
34
|
+
# "Name": "overlay1",
|
35
|
+
# "Id": "3eluvldbrv17xw6w39xxgg30a",
|
36
|
+
# "Scope": "swarm",
|
37
|
+
# "Driver": "overlay",
|
38
|
+
# "EnableIPv6": false,
|
39
|
+
# "IPAM": {
|
40
|
+
# "Driver": "default",
|
41
|
+
# "Options": null,
|
42
|
+
# "Config": [
|
43
|
+
# {
|
44
|
+
# "Subnet": "10.0.9.0/24",
|
45
|
+
# "Gateway": "10.0.9.1"
|
46
|
+
# }
|
47
|
+
# ]
|
48
|
+
# },
|
49
|
+
# "Internal": false,
|
50
|
+
# "Containers": null,
|
51
|
+
# "Options": {
|
52
|
+
# "com.docker.network.driver.overlay.vxlanid_list": "257"
|
53
|
+
# },
|
54
|
+
# "Labels": null
|
55
|
+
# }
|
56
|
+
|
data/lib/docker/swarm/node.rb
CHANGED
data/lib/docker/swarm/service.rb
CHANGED
@@ -8,11 +8,23 @@ class Docker::Swarm::Service
|
|
8
8
|
@swarm = swarm
|
9
9
|
@hash = hash
|
10
10
|
end
|
11
|
+
|
12
|
+
def name()
|
13
|
+
@hash['Spec']['Name']
|
14
|
+
end
|
11
15
|
|
12
16
|
def id()
|
13
17
|
return @hash['ID']
|
14
18
|
end
|
15
19
|
|
20
|
+
def network_ids
|
21
|
+
network_ids = []
|
22
|
+
@hash['Endpoint']['VirtualIPs'].each do |network_info|
|
23
|
+
network_ids << network_info['NetworkID']
|
24
|
+
end
|
25
|
+
return network_ids
|
26
|
+
end
|
27
|
+
|
16
28
|
def remove(opts = {})
|
17
29
|
query = {}
|
18
30
|
@swarm.connection.delete("/services/#{self.id}", query, :body => opts.to_json)
|
data/lib/docker/swarm/swarm.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'docker-api'
|
2
|
+
require 'resolv'
|
3
|
+
|
2
4
|
|
3
5
|
# This class represents a Docker Swarm Node.
|
4
6
|
class Docker::Swarm::Swarm
|
@@ -25,7 +27,16 @@ class Docker::Swarm::Swarm
|
|
25
27
|
node.connection = Docker::Swarm::Connection.new("tcp://#{ip_address}:#{docker_port}")
|
26
28
|
end
|
27
29
|
else
|
28
|
-
ip_address =
|
30
|
+
ip_address = nil
|
31
|
+
begin
|
32
|
+
ip_address = Resolv::DNS.new.getaddress(node.host_name())
|
33
|
+
rescue
|
34
|
+
ip_address = Resolv::Hosts.new.getaddress(node.host_name())
|
35
|
+
if (!ip_address)
|
36
|
+
host_addresses = options[:host_addresses]
|
37
|
+
ip_address = host_addresses[node.host_name]
|
38
|
+
end
|
39
|
+
end
|
29
40
|
node.connection = Docker::Swarm::Connection.new("tcp://#{ip_address}:#{docker_port}")
|
30
41
|
end
|
31
42
|
@node_hash[node.id] = {hash: node.hash, connection: node.connection}
|
@@ -120,15 +131,68 @@ class Docker::Swarm::Swarm
|
|
120
131
|
end
|
121
132
|
|
122
133
|
def networks
|
123
|
-
|
134
|
+
all_networks = []
|
135
|
+
response = connection.get("/networks", {}, full_response: true)
|
136
|
+
if (response.status == 200)
|
137
|
+
hashes = JSON.parse(response.body)
|
138
|
+
hashes.each do |hash|
|
139
|
+
all_networks << Docker::Swarm::Network.new(self, hash)
|
140
|
+
end
|
141
|
+
else
|
142
|
+
raise "Error finding netw"
|
143
|
+
end
|
144
|
+
return all_networks
|
124
145
|
end
|
125
146
|
|
126
|
-
def create_network(network_name)
|
127
|
-
|
147
|
+
def create_network(network_name, options = {})
|
148
|
+
defaults = {
|
149
|
+
"Name" => network_name,
|
150
|
+
"CheckDuplicate" => true,
|
151
|
+
# "Driver" => "bridge",
|
152
|
+
"Driver" => "overlay",
|
153
|
+
"EnableIPv6" => false,
|
154
|
+
# "IPAM" => {
|
155
|
+
# "Driver" => "default",
|
156
|
+
# "Config" => [
|
157
|
+
# {
|
158
|
+
# "Subnet" => "172.20.0.0/16",
|
159
|
+
# "IPRange" => "172.20.10.0/24",
|
160
|
+
# "Gateway" => "172.20.10.11"
|
161
|
+
# }
|
162
|
+
# ],
|
163
|
+
# "Options" => {
|
164
|
+
# # "foo" => "bar"
|
165
|
+
# }
|
166
|
+
# },
|
167
|
+
"Internal" => false,
|
168
|
+
"Options" => {
|
169
|
+
"com.docker.network.driver.overlay.vxlanid_list" => "257"
|
170
|
+
},
|
171
|
+
"Labels" => {
|
172
|
+
# "com.example.some-label": "some-value",
|
173
|
+
# "com.example.some-other-label": "some-other-value"
|
174
|
+
}
|
175
|
+
}
|
176
|
+
opts = defaults.merge(options)
|
177
|
+
response = connection.post('/networks/create', {}, body: opts.to_json, expects: [200, 201, 500], full_response: true)
|
178
|
+
if (response.status <= 201)
|
179
|
+
hash = JSON.parse(response.body)
|
180
|
+
response = connection.get("/networks/#{hash['Id']}", {}, expects: [200, 201], full_response: true)
|
181
|
+
hash = Docker::Util.parse_json(response.body)
|
182
|
+
network = Docker::Swarm::Network.new(self, hash)
|
183
|
+
return network
|
184
|
+
else
|
185
|
+
raise "Error creating network: HTTP-#{response.status} - #{response.body}"
|
186
|
+
end
|
128
187
|
end
|
129
188
|
|
130
189
|
def find_network_by_name(network_name)
|
131
|
-
|
190
|
+
networks.each do |network|
|
191
|
+
if (network.name == network_name)
|
192
|
+
return network
|
193
|
+
end
|
194
|
+
end
|
195
|
+
return nil
|
132
196
|
end
|
133
197
|
|
134
198
|
# Return all of the Nodes.
|
@@ -151,10 +215,15 @@ class Docker::Swarm::Swarm
|
|
151
215
|
|
152
216
|
def create_service(opts = {})
|
153
217
|
query = {}
|
154
|
-
response = self.connection.post('/services/create', query, :body => opts.to_json)
|
155
|
-
|
156
|
-
|
157
|
-
|
218
|
+
response = self.connection.post('/services/create', query, :body => opts.to_json, expects: [201, 500], full_response: true)
|
219
|
+
if (response.status <= 201)
|
220
|
+
info = JSON.parse(response.body)
|
221
|
+
service_id = info['ID']
|
222
|
+
return self.find_service(service_id)
|
223
|
+
else
|
224
|
+
raise "Error creating service: HTTP-#{response.status} #{response.body}"
|
225
|
+
end
|
226
|
+
return nil
|
158
227
|
end
|
159
228
|
|
160
229
|
def find_service(id)
|
@@ -165,6 +234,13 @@ class Docker::Swarm::Swarm
|
|
165
234
|
return Docker::Swarm::Service.new(self, hash)
|
166
235
|
end
|
167
236
|
|
237
|
+
def find_service_with_name(name)
|
238
|
+
services.each do |service|
|
239
|
+
return service if (service.name == name)
|
240
|
+
end
|
241
|
+
return nil
|
242
|
+
end
|
243
|
+
|
168
244
|
def services
|
169
245
|
items = []
|
170
246
|
query = {}
|
@@ -218,6 +294,8 @@ class Docker::Swarm::Swarm
|
|
218
294
|
if (response.status == 200)
|
219
295
|
swarm = Docker::Swarm::Swarm.new(JSON.parse(response.body), connection, options)
|
220
296
|
return swarm
|
297
|
+
elsif (response.status == 406)
|
298
|
+
return nil
|
221
299
|
else
|
222
300
|
raise "Error finding swarm: HTTP-#{response.status} #{response.body}"
|
223
301
|
end
|
data/lib/docker/swarm/version.rb
CHANGED
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.2.
|
4
|
+
version: 1.2.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-
|
11
|
+
date: 2016-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|