Module: Docker::Util

Includes:
Error
Defined in:
lib/docker/util.rb

Overview

This module holds shared logic that doesn’t really belong anywhere else in the gem.

Class Method Summary collapse

Class Method Details

.build_auth_header(credentials) ⇒ Object



76
77
78
79
80
81
82
# File 'lib/docker/util.rb', line 76

def build_auth_header(credentials)
  credentials = credentials.to_json if credentials.is_a?(Hash)
  encoded_creds = Base64.encode64(credentials).gsub(/\n/, '')
  {
    'X-Registry-Auth' => encoded_creds
  }
end

.build_config_header(credentials) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/docker/util.rb', line 84

def build_config_header(credentials)
  if credentials.is_a?(String)
    credentials = JSON.parse(credentials, symbolize_names: true)
  end
  header = {
    "configs" => {
      credentials[:serveraddress].to_s => {
        "username" => credentials[:username].to_s,
        "password" => credentials[:password].to_s,
        "email" => credentials[:email].to_s
      }
    }
  }.to_json

  encoded_header = Base64.encode64(header).gsub(/\n/, '')

  {
    'X-Registry-Config' => encoded_header
  }
end

.create_dir_tar(directory) ⇒ Object



36
37
38
39
40
41
42
43
44
45
# File 'lib/docker/util.rb', line 36

def create_dir_tar(directory)
  cwd = FileUtils.pwd
  tempfile_name = Dir::Tmpname.create('out') {}
  tempfile = File.open(tempfile_name, 'wb+')
  FileUtils.cd(directory)
  Archive::Tar::Minitar.pack('.', tempfile)
  File.new(tempfile.path, 'r')
ensure
  FileUtils.cd(cwd)
end

.create_tar(hash = {}) ⇒ Object



26
27
28
29
30
31
32
33
34
# File 'lib/docker/util.rb', line 26

def create_tar(hash = {})
  output = StringIO.new
  Gem::Package::TarWriter.new(output) do |tar|
    hash.each do |file_name, input|
      tar.add_file(file_name, 0640) { |tar_file| tar_file.write(input) }
    end
  end
  output.tap(&:rewind).string
end

.extract_id(body) ⇒ Object



47
48
49
50
51
52
53
54
# File 'lib/docker/util.rb', line 47

def extract_id(body)
  body.lines.to_a.reverse.each do |line|
    if (id = line.match(/Successfully built ([a-f0-9]+)/)) && !id[1].empty?
      return id[1]
    end
  end
  raise UnexpectedResponseError, "Couldn't find id: #{body}"
end

.file_hash_from_paths(local_paths) ⇒ Object

Convenience method to get the file hash corresponding to an array of local paths.



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/docker/util.rb', line 58

def file_hash_from_paths(local_paths)
  local_paths.each_with_object({}) do |local_path, file_hash|
    unless File.exist?(local_path)
      raise ArgumentError, "#{local_path} does not exist."
    end

    basename = File.basename(local_path)
    if File.directory?(local_path)
      tar = create_dir_tar(local_path)
      file_hash[basename] = tar.read
      tar.close
      FileUtils.rm(tar.path)
    else
      file_hash[basename] = File.read(local_path)
    end
  end
end

.fix_json(body) ⇒ Object



22
23
24
# File 'lib/docker/util.rb', line 22

def fix_json(body)
  parse_json("[#{body.gsub(/}\s*{/, '},{')}]")
end

.parse_json(body) ⇒ Object



8
9
10
11
12
# File 'lib/docker/util.rb', line 8

def parse_json(body)
  JSON.parse(body) unless body.nil? || body.empty? || (body == 'null')
rescue JSON::ParserError => ex
  raise UnexpectedResponseError, ex.message
end

.parse_repo_tag(str) ⇒ Object



14
15
16
17
18
19
20
# File 'lib/docker/util.rb', line 14

def parse_repo_tag(str)
  if match = str.match(/\A(.*):([^:]*)\z/)
    match.captures
  else
    [str, '']
  end
end