Class: Gitlab::QA::Docker::Engine

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab/qa/docker/engine.rb

Constant Summary collapse

DOCKER_HOST =
ENV['DOCKER_HOST'] || 'http://localhost'
PRIVILEGED_COMMANDS =
[/^iptables.*/].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(stream_output: false) ⇒ Engine

Returns a new instance of Engine.



12
13
14
# File 'lib/gitlab/qa/docker/engine.rb', line 12

def initialize(stream_output: false)
  @stream_output = stream_output
end

Instance Attribute Details

#stream_outputObject (readonly)

Returns the value of attribute stream_output.



10
11
12
# File 'lib/gitlab/qa/docker/engine.rb', line 10

def stream_output
  @stream_output
end

Instance Method Details

#attach(name, &block) ⇒ Object



96
97
98
# File 'lib/gitlab/qa/docker/engine.rb', line 96

def attach(name, &block)
  Docker::Command.execute("attach --sig-proxy=false #{name}", &block)
end

#container_exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


124
125
126
# File 'lib/gitlab/qa/docker/engine.rb', line 124

def container_exists?(name)
  !Docker::Command.execute("container list --all --format '{{.Names}}' --filter name=^#{name}$").empty?
end

#copy(name, src_path, dest_path) ⇒ Object



100
101
102
# File 'lib/gitlab/qa/docker/engine.rb', line 100

def copy(name, src_path, dest_path)
  Docker::Command.execute("cp #{src_path} #{name}:#{dest_path}")
end

#exec(name, command, mask_secrets: nil, shell: "bash") ⇒ Object



84
85
86
87
88
89
# File 'lib/gitlab/qa/docker/engine.rb', line 84

def exec(name, command, mask_secrets: nil, shell: "bash")
  cmd = ['exec']
  cmd << '--privileged' if privileged_command?(command)
  Docker::Command.execute(%(#{cmd.join(' ')} #{name} #{shell} -c "#{command.gsub('"', '\\"')}"),
    mask_secrets: mask_secrets)
end

#hostnameObject



16
17
18
# File 'lib/gitlab/qa/docker/engine.rb', line 16

def hostname
  URI(DOCKER_HOST).host
end

#inspect(name) ⇒ Object



148
149
150
151
152
153
154
155
156
# File 'lib/gitlab/qa/docker/engine.rb', line 148

def inspect(name)
  Docker::Command.new('inspect').then do |command|
    yield command if block_given?

    command << name

    command.execute!
  end
end

#login(username:, password:, registry:) ⇒ Object



20
21
22
23
# File 'lib/gitlab/qa/docker/engine.rb', line 20

def (username:, password:, registry:)
  Docker::Command.execute(%(login --username "#{username}" --password "#{password}" #{registry}),
    mask_secrets: password)
end

#manifest_exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


116
117
118
119
120
121
122
# File 'lib/gitlab/qa/docker/engine.rb', line 116

def manifest_exists?(name)
  Docker::Command.execute("manifest inspect #{name}")
rescue Support::ShellCommand::StatusError
  false
else
  true
end

#network_create(name) ⇒ Object



132
133
134
# File 'lib/gitlab/qa/docker/engine.rb', line 132

def network_create(name)
  Docker::Command.execute("network create #{name}")
end

#network_exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


128
129
130
# File 'lib/gitlab/qa/docker/engine.rb', line 128

def network_exists?(name)
  !Docker::Command.execute("network list --format '{{.Name}}' --filter name=^#{name}$").empty?
end

#port(name, port) ⇒ Object



136
137
138
# File 'lib/gitlab/qa/docker/engine.rb', line 136

def port(name, port)
  Docker::Command.execute("port #{name} #{port}/tcp")
end

#privileged_command?(command) ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
48
49
50
51
# File 'lib/gitlab/qa/docker/engine.rb', line 45

def privileged_command?(command)
  PRIVILEGED_COMMANDS.each do |privileged_regex|
    return true if command.match(privileged_regex)
  end

  false
end

#ps(name = nil) ⇒ Object



144
145
146
# File 'lib/gitlab/qa/docker/engine.rb', line 144

def ps(name = nil)
  Docker::Command.execute(['ps', name].compact.join(' '))
end

#pull(image:, tag: nil, quiet: true) ⇒ Object



25
26
27
28
29
30
31
32
# File 'lib/gitlab/qa/docker/engine.rb', line 25

def pull(image:, tag: nil, quiet: true)
  Docker::Command.new("pull").tap do |command|
    command << "-q" if quiet
    command << full_image_name(image, tag)

    command.execute!
  end
end

#read_file(image, tag, path, &block) ⇒ Object



91
92
93
94
# File 'lib/gitlab/qa/docker/engine.rb', line 91

def read_file(image, tag, path, &block)
  cat_file = "run --rm --entrypoint /bin/cat #{full_image_name(image, tag)} #{path}"
  Docker::Command.execute(cat_file, &block)
end

#remove(name) ⇒ Object



112
113
114
# File 'lib/gitlab/qa/docker/engine.rb', line 112

def remove(name)
  Docker::Command.execute("rm -f #{name}")
end

#restart(name) ⇒ Object



104
105
106
# File 'lib/gitlab/qa/docker/engine.rb', line 104

def restart(name)
  Docker::Command.execute("restart #{name}")
end

#run(image:, tag: nil, args: [], mask_secrets: nil) ⇒ Object



34
35
36
37
38
39
40
41
42
43
# File 'lib/gitlab/qa/docker/engine.rb', line 34

def run(image:, tag: nil, args: [], mask_secrets: nil)
  Docker::Command.new('run', stream_output: stream_output, mask_secrets: mask_secrets).tap do |command|
    yield command if block_given?

    command << full_image_name(image, tag)
    command << args if args.any?

    command.execute!
  end
end

#running?(name) ⇒ Boolean

Returns:

  • (Boolean)


140
141
142
# File 'lib/gitlab/qa/docker/engine.rb', line 140

def running?(name)
  Docker::Command.execute("ps -f name=#{name}").include?(name)
end

#stop(name) ⇒ Object



108
109
110
# File 'lib/gitlab/qa/docker/engine.rb', line 108

def stop(name)
  Docker::Command.execute("stop #{name}")
end

#write_files(name, mask_secrets: nil) ⇒ Object

Write to file(s) in the Docker container specified by @param name

Examples:

engine.write_files('gitlab-abc123') do |files|
  files.append('/etc/hosts', '127.0.0.1 localhost')
  files.write('/opt/other', <<~TEXT
    This is content
    That goes within /opt/other
  TEXT)

Parameters:

  • name

    The name of the Docker Container



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/gitlab/qa/docker/engine.rb', line 62

def write_files(name, mask_secrets: nil)
  exec(name, yield(
    Class.new do
      # @param file The name of the file
      # @param contents The content of the file to write
      # @param expand_vars Set false if you need to write an environment variable '$' to a file.
      # The variable should be escaped \\\$
      def self.write(file, contents, expand_vars = true)
        if expand_vars
          %(echo "#{contents}" > #{file};)
        else
          %(echo '#{contents}' > #{file};)
        end
      end

      def self.append(file, contents)
        %(echo "#{contents}" >> #{file};)
      end
    end
  ), mask_secrets: mask_secrets)
end