Module: Mcrain::DockerMachine

Defined in:
lib/mcrain/docker_machine.rb

Constant Summary collapse

DOCKER_MACHINE_DOCKER_HOME =
'/home/docker'.freeze

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.certs_dirObject

Returns the value of attribute certs_dir.



16
17
18
# File 'lib/mcrain/docker_machine.rb', line 16

def certs_dir
  @certs_dir
end

Class Method Details

.build_docker_options(uri) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/mcrain/docker_machine.rb', line 52

def build_docker_options(uri)
  d = DockerMachine.certs_dir
  cert_path = File.join(d, "cert.pem")
  key_path = File.join(d, "key.pem")
  files = {
    ".docker/cert.pem" => cert_path,
    ".docker/key.pem" => key_path,
  }
  download_files_from_vm(uri.host, files)
  return {
    client_cert: cert_path,
    client_key: key_path,
    scheme: 'https',
  }
end

.cp_r(src, dest) ⇒ Object



152
153
154
# File 'lib/mcrain/docker_machine.rb', line 152

def cp_r(src, dest)
  used? ? cp_r_remote(src, dest) : cp_r_local(src, dest)
end

.cp_r_local(src, dest) ⇒ Object



173
174
175
# File 'lib/mcrain/docker_machine.rb', line 173

def cp_r_local(src, dest)
  FileUtils.cp_r(src, dest)
end

.cp_r_remote(src, dest) ⇒ Object



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/mcrain/docker_machine.rb', line 156

def cp_r_remote(src, dest)
  Dir.mktmpdir("for_tarball") do |dir|
    tarball_name = "#{File.basename(src)}.tar.gz"
    FileUtils.chdir(dir) do
      FileUtils.cp_r(src, ".")
      unless system("tar zcf #{tarball_name} #{File.basename(src)}")
        raise "failed to create tarball of #{src} to #{dir}"
      end
    end
    host = URI.parse(ENV["DOCKER_HOST"]).host
    scp_connect(host) do |scp|
      scp.upload!(File.join(dir, tarball_name), dest)
      scp.session.exec!("cd #{dest} && tar zxf #{tarball_name}")
    end
  end
end

.docker_machine_nameObject



18
19
20
# File 'lib/mcrain/docker_machine.rb', line 18

def docker_machine_name
  ENV['DOCKER_MACHINE_NAME']
end

.download_files_from_vm(host, files) ⇒ Object



73
74
75
76
77
78
79
80
81
# File 'lib/mcrain/docker_machine.rb', line 73

def download_files_from_vm(host, files)
  return if files.values.all?{|f| File.readable?(f)}
  files.values.each{|f| FileUtils.mkdir_p(File.dirname(f))}
  scp_connect(host) do |scp|
    files.each do |src, dest|
      scp.download(src, dest)
    end
  end
end

.mktmpdir(&block) ⇒ Object



102
103
104
# File 'lib/mcrain/docker_machine.rb', line 102

def mktmpdir(&block)
  used? ? mktmpdir_ssh(&block) : mktmpdir_local(&block)
end

.mktmpdir_local(*args) ⇒ Object



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/mcrain/docker_machine.rb', line 135

def mktmpdir_local(*args)
  r = Dir.mktmpdir(*args)
  if block_given?
    begin
      yield(r)
    ensure
      Mcrain.logger.debug("removing #{r}")
      begin
        FileUtils.remove_entry_secure(r, true)
      rescue => e
        Mcrain.logger.warn("[#{e.class}] #{e.message}")
      end
    end
  end
  return r
end

.mktmpdir_remote(ssh, &block) ⇒ Object



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/mcrain/docker_machine.rb', line 112

def mktmpdir_remote(ssh, &block)
  Dir.mktmpdir do |orig_dir|
    dir = File.join(DOCKER_MACHINE_DOCKER_HOME, 'tmp', orig_dir)
    cmd1 = "mkdir -p #{dir}"
    Mcrain.logger.debug(cmd1)
    ssh.exec! cmd1
    if block_given?
      begin
        yield(dir)
      ensure
        begin
          cmd2 = "rm -rf #{dir}"
          Mcrain.logger.debug(cmd2)
          ssh.exec! cmd2
        rescue => e
          Mcrain.logger.warn("[#{e.class}] #{e.message}")
        end
      end
    end
    return dir
  end
end

.mktmpdir_ssh(&block) ⇒ Object



106
107
108
109
110
# File 'lib/mcrain/docker_machine.rb', line 106

def mktmpdir_ssh(&block)
  ssh_to_vm do |ssh|
    return mktmpdir_remote(ssh, &block)
  end
end

.preparing_commandObject



30
31
32
33
34
35
36
37
38
39
# File 'lib/mcrain/docker_machine.rb', line 30

def preparing_command
  return "" unless used?
  name = Mcrain::DockerMachine.docker_machine_name
  unless `docker-machine status #{name}`.strip.downcase == "running"
    raise "docker-machine #{name} is not running. Please `docker-machine start #{name}`"
  end
  exports = `docker-machine env #{name} 2>/dev/null`.strip.split(/\n/).
    select{|line| line =~ /\Aexport /}
  exports.empty? ? '' : "%s && " % exports.join(" && ")
end

.scp_connect(host, &block) ⇒ Object



83
84
85
# File 'lib/mcrain/docker_machine.rb', line 83

def scp_connect(host, &block)
  Net::SCP.start(host, "docker", :password => "tcuser", &block)
end

.setup_docker_optionsObject



41
42
43
44
45
46
47
48
49
50
# File 'lib/mcrain/docker_machine.rb', line 41

def setup_docker_options
  if used?
    require 'docker'
    uri = URI.parse(ENV["DOCKER_HOST"])
    Excon.defaults[:ssl_verify_peer] = false
    Docker.options = build_docker_options(uri)
  elsif ENV["DOCKER_HOST"].nil?
    ENV["DOCKER_HOST"] = "http://localhost:2375"
  end
end

.ssh_to_vm(&block) ⇒ Object



94
95
96
97
98
99
100
# File 'lib/mcrain/docker_machine.rb', line 94

def ssh_to_vm(&block)
  host = used? ? URI.parse(ENV["DOCKER_HOST"]).host : "localhost"
  Mcrain.logger.debug("connection STARTING to #{host} by SSH")
  r = Net::SSH.start(host, "docker", :password => "tcuser", &block)
  Mcrain.logger.debug("connection SUCCESS  to #{host} by SSH")
  return r
end

.tmpdirObject

return temporary dire for 2nd argument of Dir.mktmpdir



90
91
92
# File 'lib/mcrain/docker_machine.rb', line 90

def tmpdir
  used? ? File.join(DOCKER_MACHINE_DOCKER_HOME, 'tmp', Dir.tmpdir) : Dir.tmpdir
end

.used?Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/mcrain/docker_machine.rb', line 26

def used?
  RbConfig::CONFIG["host_os"] =~ /darwin/
end