dockerapi 0.4.0 → 0.5.0

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
  SHA256:
3
- metadata.gz: 1fce5f833c28f2144c012a8aa5c667bdb520b4bc0423a6407263da6597f7bc1e
4
- data.tar.gz: 0f7cb0476f93e1fea20f06567e9fd72f168c987d91dd5eb5bf8a0430c976bc92
3
+ metadata.gz: f647538a729eaa623b009a4e97713761bc80579073ebfb8b9ab7bfa26b6b6d98
4
+ data.tar.gz: ce3b40c357d635a47ab8c921b59254ef734c2ec1173da60e58ba1b6f7d325ecf
5
5
  SHA512:
6
- metadata.gz: d8e21c6f481339361c91f74a4134c1a989007e04c88e1192618275f908be0c2436324b5939571ec4fbfbfe462b6872c13e575cef5026fd78b92250809a21582c
7
- data.tar.gz: 3167dad7f68cf3395b26de3baf6a595ba42403f52bacc0ec455394aa9e19dd76cb461517c5b9d4a389e6019508a2438ddef12f5ad78cdf4d632c879369de22b1
6
+ metadata.gz: f845ea3e89761d9ab726f098d4ef4ca1586c92320616359b182d6f9dc24e7769b53c88a6d17d8257514303226b16fd08a841ced1645be68c19b4d4b31a8a9b4f
7
+ data.tar.gz: 409819921a1135b593377d8c561d0d5f81013f519e98a547976b1563b4038bff91f5948a5cd00b9f7513026821811b9baa476306915b7b644768232238daf0f4
@@ -1,3 +1,20 @@
1
+ # 0.5.0
2
+
3
+ Add Docker::API::System methods:
4
+ * auth
5
+ * ping
6
+ * info
7
+ * version
8
+ * events
9
+ * df
10
+
11
+ Add new response class Docker::API::Response with the following methods:
12
+ * json
13
+ * path
14
+ * success?
15
+
16
+ Error classes output better error messages.
17
+
1
18
  # 0.4.0
2
19
 
3
20
  Add Docker::API::Network methods:
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dockerapi (0.4.0)
4
+ dockerapi (0.5.0)
5
5
  excon (~> 0.74.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -196,13 +196,64 @@ Docker::API::Network.connect( "my-network", Container: "my-container" )
196
196
  Docker::API::Network.disconnect( "my-network", Container: "my-container" )
197
197
  ```
198
198
 
199
+ ### System
200
+
201
+ ```ruby
202
+ # Ping docker api
203
+ Docker::API::System.ping
204
+
205
+ # Docker components versions
206
+ Docker::API::System.version
207
+
208
+ # System info
209
+ Docker::API::System.info
210
+
211
+ # System events (stream)
212
+ Docker::API::System.events(until: Time.now.to_i)
213
+
214
+ # Data usage information
215
+ Docker::API::System.df
216
+ ```
217
+
199
218
  ### Requests
200
219
 
201
220
  Requests should work as described in [Docker API documentation](https://docs.docker.com/engine/api/v1.40). Check it out to customize your requests.
202
221
 
203
222
  ### Response
204
223
 
205
- All requests return a Excon::Response object.
224
+ All requests return a response class that inherits from Excon::Response. Available attribute readers and methods include: `status`, `data`, `body`, `headers`, `json`, `path`, `success?`.
225
+
226
+ ```ruby
227
+ response = Docker::API::Image.create(fromImage: "busybox:latest")
228
+
229
+ response
230
+ => #<Docker::API::Response:0x000055bb390b35c0 ... >
231
+
232
+ response.status
233
+ => 200
234
+
235
+ response.data
236
+ => {:body=>"...", :cookies=>[], :host=>nil, :headers=>{ ... }, :path=>"/images/create?fromImage=busybox:latest", :port=>nil, :status=>200, :status_line=>"HTTP/1.1 200 OK\r\n", :reason_phrase=>"OK"}
237
+
238
+ response.headers
239
+ => {"Api-Version"=>"1.40", "Content-Type"=>"application/json", "Docker-Experimental"=>"false", "Ostype"=>"linux", "Server"=>"Docker/19.03.11 (linux)", "Date"=>"Mon, 29 Jun 2020 16:10:06 GMT"}
240
+
241
+ response.body
242
+ => "{\"status\":\"Pulling from library/busybox\" ... "
243
+
244
+ response.json
245
+ => [{:status=>"Pulling from library/busybox", :id=>"latest"}, {:status=>"Pulling fs layer", :progressDetail=>{}, :id=>"76df9210b28c"}, ... , {:status=>"Status: Downloaded newer image for busybox:latest"}]
246
+
247
+ response.path
248
+ => "/images/create?fromImage=busybox:latest"
249
+
250
+ response.success?
251
+ => true
252
+ ```
253
+
254
+ ### Error handling
255
+
256
+ `Docker::API::InvalidParameter` and `Docker::API::InvalidRequestBody` may be raised when an invalid option is passed as argument (ie: an option not described in Docker API documentation for request query parameters nor request body (json) parameters). Even if no errors were raised, consider validating the status code and/or message of the response to check if the Docker daemon has fulfilled the operation properly.
206
257
 
207
258
  ## Development
208
259
 
@@ -223,7 +274,7 @@ WIP: Work In Progress
223
274
  | Image | Ok | Ok | NS |
224
275
  | Volume | Ok | Ok | NS |
225
276
  | Network | Ok | Ok | NS |
226
- | System | NS | NS | NS |
277
+ | System | Ok | Ok | NS |
227
278
  | Exec | NS | NS | NS |
228
279
  | Swarm | NS | NS | NS |
229
280
  | Node | NS | NS | NS |
@@ -232,8 +283,8 @@ WIP: Work In Progress
232
283
  | Secret | NS | NS | NS |
233
284
 
234
285
  Misc:
235
- * Improve response object
236
- * Improve error objects
286
+ * ~~Improve response object~~
287
+ * ~~Improve error objects~~
237
288
 
238
289
  ## Contributing
239
290
 
@@ -12,9 +12,9 @@ module Docker
12
12
  Docker::API::Connection.instance
13
13
  end
14
14
 
15
- def self.validate error, permitted_keys, params
16
- not_permitted = params.keys.map(&:to_s) - permitted_keys.map(&:to_s)
17
- raise error if not_permitted.size > 0
15
+ def self.validate error, permitted, params
16
+ unpermitted = params.keys.map(&:to_s) - permitted.map(&:to_s)
17
+ raise error.new(permitted, unpermitted) if unpermitted.size > 0
18
18
  end
19
19
 
20
20
  ## Converts Ruby Hash into query parameters
@@ -1,6 +1,4 @@
1
- require "excon"
2
1
  require "singleton"
3
- require "json"
4
2
  module Docker
5
3
  module API
6
4
  class Connection
@@ -15,7 +13,7 @@ module Docker
15
13
  end
16
14
 
17
15
  def request params
18
- @connection.request(params)
16
+ Docker::API::Response.new(@connection.request(params).data)
19
17
  end
20
18
 
21
19
  private
@@ -1,6 +1,17 @@
1
1
  module Docker
2
2
  module API
3
- class InvalidParameter < StandardError; end
4
- class InvalidRequestBody < StandardError; end
3
+ class ValidationError < StandardError
4
+ def initialize permitted, unpermitted
5
+ super("Unpermitted options found: #{unpermitted.to_s}. Permitted are #{permitted.to_s}")
6
+ end
7
+ end
8
+ class Error < StandardError
9
+ def initialize msg = "Error without specific message"
10
+ super(msg)
11
+ end
12
+ end
13
+
14
+ class InvalidParameter < Docker::API::ValidationError; end
15
+ class InvalidRequestBody < Docker::API::ValidationError; end
5
16
  end
6
17
  end
@@ -107,7 +107,7 @@ module Docker
107
107
  end
108
108
 
109
109
  def self.build path, params = {}, authentication = {}
110
- raise Docker::API::InvalidRequestBody unless path || params[:remote]
110
+ raise Docker::API::Error.new("Expected path or params[:remote]") unless path || params[:remote]
111
111
  validate Docker::API::InvalidParameter, Docker::API::BuildParams, params
112
112
 
113
113
  header = {"Content-type": "application/x-tar"}
@@ -0,0 +1,25 @@
1
+ module Docker
2
+ module API
3
+ class Response < Excon::Response
4
+ attr_reader(:json, :path)
5
+
6
+ def initialize data
7
+ super data
8
+ @json = parse_json @body
9
+ @path = @data[:path]
10
+ end
11
+
12
+ def success?
13
+ (200..204).include? @status
14
+ end
15
+
16
+ private
17
+
18
+ def parse_json data
19
+ return nil unless headers["Content-Type"] == "application/json"
20
+ return nil if data == ""
21
+ data.split("\r\n").size > 1 ? data.split("\r\n").map{ |e| eval(e) } : JSON.parse(data)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -7,6 +7,27 @@ module Docker
7
7
  validate Docker::API::InvalidRequestBody, [:username, :password, :email, :serveraddress, :identitytoken], body
8
8
  connection.request(method: :post, path: "/auth", headers: { "Content-Type" => "application/json" }, body: body.to_json)
9
9
  end
10
+
11
+ def self.events params = {}
12
+ validate Docker::API::InvalidParameter, [:since, :until, :filters], params
13
+ connection.request(method: :get, path: build_path("/events", params), response_block: lambda { |chunk, remaining_bytes, total_bytes| puts chunk.inspect } )
14
+ end
15
+
16
+ def self.ping
17
+ connection.get("/_ping")
18
+ end
19
+
20
+ def self.info
21
+ connection.get("/info")
22
+ end
23
+
24
+ def self.version
25
+ connection.get("/version")
26
+ end
27
+
28
+ def self.df
29
+ connection.get("/system/df")
30
+ end
10
31
  end
11
32
  end
12
33
  end
@@ -1,6 +1,6 @@
1
1
  module Docker
2
2
  module API
3
- GEM_VERSION = "0.4.0"
3
+ GEM_VERSION = "0.5.0"
4
4
 
5
5
  API_VERSION = "1.40"
6
6
 
@@ -1,7 +1,10 @@
1
- require "docker/api/version"
1
+ require "excon"
2
+ require "json"
2
3
 
4
+ require "docker/api/version"
3
5
  require "docker/api/error"
4
6
  require "docker/api/connection"
7
+ require "docker/api/response"
5
8
  require "docker/api/base"
6
9
  require "docker/api/container"
7
10
  require "docker/api/image"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dockerapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alysson A. Costa
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-28 00:00:00.000000000 Z
11
+ date: 2020-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: excon
@@ -49,6 +49,7 @@ files:
49
49
  - lib/docker/api/error.rb
50
50
  - lib/docker/api/image.rb
51
51
  - lib/docker/api/network.rb
52
+ - lib/docker/api/response.rb
52
53
  - lib/docker/api/system.rb
53
54
  - lib/docker/api/version.rb
54
55
  - lib/docker/api/volume.rb