docker-swarm-api 1.2.1 → 1.2.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: 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