Class: Docker::Connection
- Inherits:
-
Object
- Object
- Docker::Connection
- Includes:
- Error
- Defined in:
- lib/docker/connection.rb
Overview
This class represents a Connection to a Docker server. The Connection is immutable in that once the url and options is set they cannot be changed.
Instance Attribute Summary collapse
-
#options ⇒ Object
readonly
Returns the value of attribute options.
-
#url ⇒ Object
readonly
Returns the value of attribute url.
Instance Method Summary collapse
-
#info ⇒ Object
Common attribute requests.
-
#initialize(url, opts) ⇒ Connection
constructor
Create a new Connection.
- #log_request(request) ⇒ Object
- #ping ⇒ Object
- #podman? ⇒ Boolean
-
#request(*args, &block) ⇒ Object
Send a request to the server with the ‘.
- #rootless? ⇒ Boolean
- #to_s ⇒ Object
- #version ⇒ Object
Constructor Details
#initialize(url, opts) ⇒ Connection
Create a new Connection. This method takes a url (String) and options (Hash). These are passed to Excon, so any options valid for Excon.new can be passed here.
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/docker/connection.rb', line 14 def initialize(url, opts) case when !url.is_a?(String) raise ArgumentError, "Expected a String, got: '#{url}'" when !opts.is_a?(Hash) raise ArgumentError, "Expected a Hash, got: '#{opts}'" else uri = URI.parse(url) if uri.scheme == "unix" @url, = 'unix:///', {:socket => uri.path}.merge(opts) elsif uri.scheme =~ /^(https?|tcp)$/ @url, = url, opts else @url, = "http://#{uri}", opts end end end |
Instance Attribute Details
#options ⇒ Object (readonly)
Returns the value of attribute options.
9 10 11 |
# File 'lib/docker/connection.rb', line 9 def end |
#url ⇒ Object (readonly)
Returns the value of attribute url.
9 10 11 |
# File 'lib/docker/connection.rb', line 9 def url @url end |
Instance Method Details
#info ⇒ Object
Common attribute requests
113 114 115 |
# File 'lib/docker/connection.rb', line 113 def info Docker::Util.parse_json(get('/info')) end |
#log_request(request) ⇒ Object
95 96 97 98 99 100 101 |
# File 'lib/docker/connection.rb', line 95 def log_request(request) if Docker.logger Docker.logger.debug( [request[:method], request[:path], request[:query], request[:body]] ) end end |
#ping ⇒ Object
117 118 119 |
# File 'lib/docker/connection.rb', line 117 def ping get('/_ping') end |
#podman? ⇒ Boolean
121 122 123 124 125 126 127 |
# File 'lib/docker/connection.rb', line 121 def podman? @podman ||= !( Array(version['Components']).find do |component| component['Name'].include?('Podman') end ).nil? end |
#request(*args, &block) ⇒ Object
Send a request to the server with the ‘
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/docker/connection.rb', line 40 def request(*args, &block) retries ||= 0 request = compile_request_params(*args, &block) log_request(request) begin resource.request(request).body rescue Excon::Errors::BadRequest => ex if retries < 2 response_cause = '' begin response_cause = JSON.parse(ex.response.body)['cause'] rescue JSON::ParserError #noop end if response_cause.is_a?(String) # The error message will tell the application type given and then the # application type that the message should be # # This is not perfect since it relies on processing a message that # could change in the future. However, it should be a good stop-gap # until all methods are updated to pass in the appropriate content # type. # # A current example message is: # * 'Content-Type: application/json is not supported. Should be "application/x-tar"' matches = response_cause.delete('"\'').scan(%r{(application/\S+)}) unless matches.count < 2 Docker.logger.warn( " Automatically retrying with content type '\#{response_cause}'\n Original Error: \#{ex}\n RETRY_WARNING\n ) if Docker.logger\n\n request[:headers]['Content-Type'] = matches.last.first\n retries += 1\n retry\n end\n end\n end\n raise ClientError, ex.response.body\n rescue Excon::Errors::Unauthorized => ex\n raise UnauthorizedError, ex.response.body\n rescue Excon::Errors::NotFound => ex\n raise NotFoundError, ex.response.body\n rescue Excon::Errors::Conflict => ex\n raise ConflictError, ex.response.body\n rescue Excon::Errors::InternalServerError => ex\n raise ServerError, ex.response.body\n rescue Excon::Errors::Timeout => ex\n raise TimeoutError, ex.message\n end\nend\n" |
#rootless? ⇒ Boolean
129 130 131 |
# File 'lib/docker/connection.rb', line 129 def rootless? @rootless ||= (info['Rootless'] == true) end |
#to_s ⇒ Object
103 104 105 |
# File 'lib/docker/connection.rb', line 103 def to_s "Docker::Connection { :url => #{url}, :options => #{options} }" end |
#version ⇒ Object
133 134 135 |
# File 'lib/docker/connection.rb', line 133 def version @version ||= Docker::Util.parse_json(get('/version')) end |