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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f0b90891a651e044750fc2bc7b1956679634db08
4
- data.tar.gz: 7fd85045899307db8a32fb3d94654167f4ba8ef2
3
+ metadata.gz: 1a8630271a889f20bc866426d01c86a9892e6fbe
4
+ data.tar.gz: 41d722648cf609db8f83da1e27715cd7f519040f
5
5
  SHA512:
6
- metadata.gz: 4083515f3553d91273ea6e8f0b3959f71996529f9ab3340fd8f6e756677bf6cca787748e9491ec5b2e778d17e89b48ca1bc7a8c50b778e7b492f8bce6f119b17
7
- data.tar.gz: a0e8a29a37b6eabc9c42e5963db95de9568cc2070b6c6e9fc00c008eb973d81ee38383ab2308873b6187af16076f49f32d1e1f37b8b6ad11c952ad0f0c17974d
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
@@ -1 +1 @@
1
- require 'docker-swarm'
1
+ require_relative './docker-swarm'
@@ -22,12 +22,18 @@ module Docker
22
22
  module Swarm
23
23
  attr_accessor :creds, :logger
24
24
 
25
- require 'docker/swarm/node'
26
- require 'docker/swarm/service'
27
- require 'docker/swarm/swarm'
28
- require 'docker/swarm/connection'
29
- require 'docker/swarm/network'
30
- require 'docker/swarm/task'
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
@@ -1,16 +1,56 @@
1
1
  require 'docker-api'
2
2
 
3
- class Docker::Swarm::Network < Docker::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 self.find_by_name(network_name, connection)
7
- networks = Docker::Network.all({}, connection)
8
-
9
- networks.each do |network|
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
- end
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
+
@@ -61,7 +61,7 @@ class Docker::Swarm::Node
61
61
 
62
62
  def tasks
63
63
  return @swarm.tasks.select {|t|
64
- t.node.id == self.id
64
+ (t.node != nil) && (t.node.id == self.id)
65
65
  }
66
66
  end
67
67
 
@@ -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)
@@ -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 = Resolv::DNS.new.getaddress(node.host_name())
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
- networks = Docker::Network.all({}, self.connection)
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
- return Docker::Swarm::Network.create(network_name, opts = {}, self.connection)
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
- return Docker::Swarm::Network::find_by_name(network_name, self.connection)
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
- info = JSON.parse(response)
156
- service_id = info['ID']
157
- return self.find_service(service_id)
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
@@ -1,7 +1,7 @@
1
1
  module Docker
2
2
  module Swarm
3
3
  # The version of the docker-api gem.
4
- VERSION = '1.2.1'
4
+ VERSION = '1.2.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.2.1
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-26 00:00:00.000000000 Z
11
+ date: 2016-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json