beaker-docker 1.3.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,176 +1,79 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rspec/core/rake_task'
2
4
 
3
- namespace :test do
5
+ begin
6
+ require 'rubocop/rake_task'
7
+ rescue LoadError
8
+ # RuboCop is an optional group
9
+ else
10
+ RuboCop::RakeTask.new(:rubocop) do |task|
11
+ # These make the rubocop experience maybe slightly less terrible
12
+ task.options = ['--display-cop-names', '--display-style-guide', '--extra-details']
13
+ # Use Rubocop's Github Actions formatter if possible
14
+ task.formatters << 'github' if ENV['GITHUB_ACTIONS'] == 'true'
15
+ end
16
+ end
4
17
 
18
+ namespace :test do
5
19
  namespace :spec do
6
-
7
- desc "Run spec tests"
20
+ desc 'Run spec tests'
8
21
  RSpec::Core::RakeTask.new(:run) do |t|
9
22
  t.rspec_opts = ['--color', '--format documentation']
10
23
  t.pattern = 'spec/'
11
24
  end
12
25
 
13
- desc "Run spec tests with coverage"
26
+ desc 'Run spec tests with coverage'
14
27
  RSpec::Core::RakeTask.new(:coverage) do |t|
15
28
  ENV['BEAKER_DOCKER_COVERAGE'] = 'y'
16
29
  t.rspec_opts = ['--color', '--format documentation']
17
30
  t.pattern = 'spec/'
18
31
  end
19
-
20
32
  end
21
33
 
22
34
  namespace :acceptance do
23
-
24
- desc <<-EOS
25
- A quick acceptance test, named because it has no pre-suites to run
26
- EOS
35
+ desc 'A quick acceptance test, named because it has no pre-suites to run'
27
36
  task :quick do
28
-
29
- # setup & load_path of beaker's acceptance base and lib directory
30
- beaker_gem_spec = Gem::Specification.find_by_name('beaker')
31
- beaker_gem_dir = beaker_gem_spec.gem_dir
32
- beaker_test_base_dir = File.join(beaker_gem_dir, 'acceptance/tests/base')
33
- load_path_option = File.join(beaker_gem_dir, 'acceptance/lib')
37
+ ## setup & load_path of beaker's acceptance base and lib directory
38
+ ## see below for the reason why it's commented out atm
39
+ # beaker_gem_spec = Gem::Specification.find_by_name('beaker')
40
+ # beaker_gem_dir = beaker_gem_spec.gem_dir
41
+ # beaker_test_base_dir = File.join(beaker_gem_dir, 'acceptance/tests/base')
42
+ # load_path_option = File.join(beaker_gem_dir, 'acceptance/lib')
34
43
 
35
44
  ENV['BEAKER_setfile'] = 'acceptance/config/nodes/hosts.yaml'
36
- sh("beaker",
37
- "--hosts", "acceptance/config/nodes/hosts.yaml",
38
- # We can't run these tests until the rsync support in the main
39
- # beaker/host.rb is updated to work with passwords.
40
- # "--tests", beaker_test_base_dir,
41
- # "--load-path", load_path_option,
42
- "--tests", 'acceptance/tests/',
43
- "--log-level", "debug",
44
- "--debug")
45
+ sh('beaker',
46
+ '--hosts', 'acceptance/config/nodes/hosts.yaml',
47
+ ## We can't run these tests until the rsync support in the main
48
+ ## beaker/host.rb is updated to work with passwords.
49
+ # '--tests', beaker_test_base_dir,
50
+ # '--load-path', load_path_option,
51
+ '--tests', 'acceptance/tests/',
52
+ '--log-level', 'debug',
53
+ '--debug')
45
54
  end
46
-
47
55
  end
48
-
49
56
  end
50
57
 
51
58
  # namespace-named default tasks.
52
59
  # these are the default tasks invoked when only the namespace is referenced.
53
60
  # they're needed because `task :default` in those blocks doesn't work as expected.
54
- task 'test:spec' => 'test:spec:run'
55
- task 'test:acceptance' => 'test:acceptance:quick'
61
+ task 'test:spec': %i[test:spec:run]
62
+ task 'test:acceptance': %i[test:acceptance:quick]
56
63
 
57
64
  # global defaults
58
- task :test => 'test:spec'
59
- task :default => :test
60
-
61
- ###########################################################
62
- #
63
- # Documentation Tasks
64
- #
65
- ###########################################################
66
- DOCS_DAEMON = "yard server --reload --daemon --server thin"
67
- FOREGROUND_SERVER = 'bundle exec yard server --reload --verbose --server thin lib/beaker'
68
-
69
- def running?( cmdline )
70
- ps = `ps -ef`
71
- found = ps.lines.grep( /#{Regexp.quote( cmdline )}/ )
72
- if found.length > 1
73
- raise StandardError, "Found multiple YARD Servers. Don't know what to do."
74
- end
75
-
76
- yes = found.empty? ? false : true
77
- return yes, found.first
78
- end
79
-
80
- def pid_from( output )
81
- output.squeeze(' ').strip.split(' ')[1]
82
- end
83
-
84
- desc 'Start the documentation server in the foreground'
85
- task :docs => 'docs:clear' do
86
- original_dir = Dir.pwd
87
- Dir.chdir( File.expand_path(File.dirname(__FILE__)) )
88
- sh FOREGROUND_SERVER
89
- Dir.chdir( original_dir )
90
- end
91
-
92
- namespace :docs do
93
-
94
- desc 'Clear the generated documentation cache'
95
- task :clear do
96
- original_dir = Dir.pwd
97
- Dir.chdir( File.expand_path(File.dirname(__FILE__)) )
98
- sh 'rm -rf docs'
99
- Dir.chdir( original_dir )
100
- end
101
-
102
- desc 'Generate static documentation'
103
- task :gen => 'docs:clear' do
104
- original_dir = Dir.pwd
105
- Dir.chdir( File.expand_path(File.dirname(__FILE__)) )
106
- output = `bundle exec yard doc`
107
- puts output
108
- if output =~ /\[warn\]|\[error\]/
109
- fail "Errors/Warnings during yard documentation generation"
110
- end
111
- Dir.chdir( original_dir )
112
- end
113
-
114
- desc 'Run the documentation server in the background, alias `bg`'
115
- task :background => 'docs:clear' do
116
- yes, output = running?( DOCS_DAEMON )
117
- if yes
118
- puts "Not starting a new YARD Server..."
119
- puts "Found one running with pid #{pid_from( output )}."
120
- else
121
- original_dir = Dir.pwd
122
- Dir.chdir( File.expand_path(File.dirname(__FILE__)) )
123
- sh "bundle exec #{DOCS_DAEMON}"
124
- Dir.chdir( original_dir )
125
- end
126
- end
127
-
128
- task(:bg) { Rake::Task['docs:background'].invoke }
129
-
130
- desc 'Check the status of the documentation server'
131
- task :status do
132
- yes, output = running?( DOCS_DAEMON )
133
- if yes
134
- pid = pid_from( output )
135
- puts "Found a YARD Server running with pid #{pid}"
136
- else
137
- puts "Could not find a running YARD Server."
138
- end
139
- end
140
-
141
- desc "Stop a running YARD Server"
142
- task :stop do
143
- yes, output = running?( DOCS_DAEMON )
144
- if yes
145
- pid = pid_from( output )
146
- puts "Found a YARD Server running with pid #{pid}"
147
- `kill #{pid}`
148
- puts "Stopping..."
149
- yes, output = running?( DOCS_DAEMON )
150
- if yes
151
- `kill -9 #{pid}`
152
- yes, output = running?( DOCS_DAEMON )
153
- if yes
154
- puts "Could not Stop Server!"
155
- else
156
- puts "Server stopped."
157
- end
158
- else
159
- puts "Server stopped."
160
- end
161
- else
162
- puts "Could not find a running YARD Server"
163
- end
164
- end
165
- end
65
+ task lint: %i[lint:rubocop]
66
+ task test: %i[test:spec]
67
+ task default: %i[test]
166
68
 
167
69
  begin
168
70
  require 'rubygems'
169
71
  require 'github_changelog_generator/task'
170
72
  rescue LoadError
73
+ # Do nothing if no required gem installed
171
74
  else
172
75
  GitHubChangelogGenerator::RakeTask.new :changelog do |config|
173
- config.exclude_labels = %w{duplicate question invalid wontfix wont-fix skip-changelog}
76
+ config.exclude_labels = %w[duplicate question invalid wontfix wont-fix skip-changelog]
174
77
  config.user = 'voxpupuli'
175
78
  config.project = 'beaker-docker'
176
79
  gem_version = Gem::Specification.load("#{config.project}.gemspec").version
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'beaker'
2
- require 'beaker-rspec'
3
4
 
4
- RSpec.describe 'it can connect' do
5
+ test_name 'Ensure docker container is accessible' do
5
6
  hosts.each do |host|
6
- context "on #{host}" do
7
- on(host, 'ls /tmp')
7
+ step "on #{host}" do
8
+ on(host, 'true')
8
9
  end
9
10
  end
10
11
  end
@@ -1,35 +1,41 @@
1
- # -*- encoding: utf-8 -*-
2
- $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift File.expand_path('lib', __dir__)
3
4
  require 'beaker-docker/version'
4
5
 
5
6
  Gem::Specification.new do |s|
6
- s.name = "beaker-docker"
7
+ s.name = 'beaker-docker'
7
8
  s.version = BeakerDocker::VERSION
8
9
  s.authors = [
9
- "Vox Pupuli",
10
- "Rishi Javia",
11
- "Kevin Imber",
12
- "Tony Vu"
10
+ 'Vox Pupuli',
11
+ 'Rishi Javia',
12
+ 'Kevin Imber',
13
+ 'Tony Vu',
13
14
  ]
14
- s.email = ["voxpupuli@groups.io"]
15
- s.homepage = "https://github.com/voxpupuli/beaker-docker"
16
- s.summary = %q{Beaker DSL Extension Helpers!}
17
- s.description = %q{For use for the Beaker acceptance testing tool}
15
+ s.email = ['voxpupuli@groups.io']
16
+ s.homepage = 'https://github.com/voxpupuli/beaker-docker'
17
+ s.summary = 'Docker hypervisor for Beaker acceptance testing framework'
18
+ s.description = 'Allows running Beaker tests using Docker'
18
19
  s.license = 'Apache-2.0'
19
20
 
20
21
  s.files = `git ls-files`.split("\n")
21
22
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
- s.require_paths = ["lib"]
23
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
24
+ s.require_paths = ['lib']
25
+
26
+ s.required_ruby_version = '>= 2.4', '< 4'
24
27
 
25
28
  # Testing dependencies
26
- s.add_development_dependency 'rspec', '~> 3.0'
27
- s.add_development_dependency 'rspec-its', '~> 1.3'
28
- s.add_development_dependency 'fakefs', '~> 1.3'
29
+ s.add_development_dependency 'fakefs', '>= 1.3', '< 3.0'
29
30
  s.add_development_dependency 'rake', '~> 13.0'
31
+ s.add_development_dependency 'rspec', '~> 3.0'
32
+ s.add_development_dependency 'rubocop', '~> 1.12.0'
33
+ s.add_development_dependency 'rubocop-performance', '~> 1.10'
34
+ s.add_development_dependency 'rubocop-rake', '~> 0.2'
35
+ s.add_development_dependency 'rubocop-rspec', '>= 1.44'
30
36
 
31
37
  # Run time dependencies
32
- s.add_runtime_dependency 'stringify-hash', '~> 0.0.0'
33
- s.add_runtime_dependency 'docker-api', '~> 2.1'
34
38
  s.add_runtime_dependency 'beaker', '>= 4.34'
39
+ s.add_runtime_dependency 'docker-api', '~> 2.1'
40
+ s.add_runtime_dependency 'stringify-hash', '~> 0.0.0'
35
41
  end
data/bin/beaker-docker CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'rubygems' unless defined?(Gem)
4
5
  require 'beaker-docker'
5
6
 
6
- VERSION_STRING =
7
- "
7
+ VERSION_STRING = <<'VER'
8
8
  _ .--.
9
9
  ( ` )
10
10
  beaker-docker .-' `--,
@@ -14,19 +14,17 @@ VERSION_STRING =
14
14
  ;| _| _| _| '-'__,--'`--'
15
15
  | _| _| _| _| |
16
16
  _ || _| _| _| _| %s
17
- _( `--.\\_| _| _| _|/
17
+ _( `--.\_| _| _| _|/
18
18
  .-' )--,| _| _|.`
19
19
  (__, (_ ) )_| _| /
20
- `-.__.\\ _,--'\\|__|__/
20
+ `-.__.\ _,--'\|__|__/
21
21
  ;____;
22
- \\YT/
22
+ \YT/
23
23
  ||
24
- |\"\"|
24
+ |""|
25
25
  '=='
26
- "
26
+ VER
27
27
 
28
-
29
-
30
- puts BeakerDocker::VERSION
28
+ puts VERSION_STRING % BeakerDocker::VERSION
31
29
 
32
30
  exit 0
@@ -30,14 +30,14 @@ module Beaker
30
30
  * Check your DOCKER_HOST variable has been set
31
31
  * If you are on OSX or Windows, you might not have Docker Machine setup correctly: https://docs.docker.com/machine/
32
32
  * If you are using rootless podman, you might need to set up your local socket and service
33
- ERRMSG
33
+ ERRMSG
34
34
  end
35
35
 
36
36
  # Pass on all the logging from docker-api to the beaker logger instance
37
37
  ::Docker.logger = @logger
38
38
 
39
39
  # Find out what kind of remote instance we are talking against
40
- if @docker_version['Version'] =~ /swarm/
40
+ if /swarm/.match?(@docker_version['Version'])
41
41
  @docker_type = 'swarm'
42
42
  unless ENV['DOCKER_REGISTRY']
43
43
  raise "Using Swarm with beaker requires a private registry. Please setup the private registry and set the 'DOCKER_REGISTRY' env var"
@@ -58,7 +58,7 @@ module Beaker
58
58
 
59
59
  # If the container is running ssh as its init process then this method
60
60
  # will cause issues.
61
- if host[:docker_cmd] =~ /sshd/
61
+ if /sshd/.match?(Array(host[:docker_cmd]).first)
62
62
  def host.ssh_service_restart
63
63
  self[:docker_container].exec(%w(kill -1 1))
64
64
  end
@@ -142,9 +142,9 @@ module Beaker
142
142
  port: nil
143
143
  }
144
144
 
145
- container_json = container.json
145
+ container_json = container.json
146
146
  network_settings = container_json['NetworkSettings']
147
- host_config = container_json['HostConfig']
147
+ host_config = container_json['HostConfig']
148
148
 
149
149
  ip = nil
150
150
  port = nil
@@ -161,31 +161,28 @@ module Beaker
161
161
 
162
162
  # Host to Container
163
163
  port22 = network_settings.dig('PortBindings','22/tcp')
164
- if port22.nil? && network_settings.key?('Ports')
164
+ if port22.nil? && network_settings.key?('Ports') && !nested_docker?
165
165
  port22 = network_settings.dig('Ports','22/tcp')
166
166
  end
167
+
167
168
  ip = port22[0]['HostIp'] if port22
168
169
  port = port22[0]['HostPort'] if port22
169
170
 
170
171
  # Container to container
171
172
  unless ip && port
172
- ip = nil
173
- port = nil
174
-
175
173
  ip = network_settings['IPAddress']
176
- port = 22 if ip && !ip.empty?
174
+ port = ip && !ip.empty? ? 22 : nil
177
175
  end
178
176
 
179
177
  # Container through gateway
180
178
  unless ip && port
181
- ip = nil
182
- port = nil
183
-
184
179
  ip = network_settings['Gateway']
185
180
 
186
181
  if ip && !ip.empty?
187
182
  port22 = network_settings.dig('PortBindings','22/tcp')
188
183
  port = port22[0]['HostPort'] if port22
184
+ else
185
+ port = nil
189
186
  end
190
187
  end
191
188
 
@@ -216,7 +213,6 @@ module Beaker
216
213
  @hosts.each do |host|
217
214
  @logger.notify "provisioning #{host.name}"
218
215
 
219
-
220
216
  image = get_container_image(host)
221
217
 
222
218
  if host['tag']
@@ -510,145 +506,129 @@ module Beaker
510
506
 
511
507
  def dockerfile_for(host)
512
508
  # specify base image
513
- dockerfile = <<-EOF
509
+ dockerfile = <<~DF
514
510
  FROM #{host['image']}
515
511
  ENV container docker
516
- EOF
512
+ DF
517
513
 
518
514
  # Commands before any other commands. Can be used for eg. proxy configuration
519
- dockerfile += (host['docker_image_first_commands'] || []).map { |command|
520
- "RUN #{command}\n"
521
- }.join('')
522
-
523
- # additional options to specify to the sshd
524
- # may vary by platform
525
- sshd_options = ''
515
+ dockerfile += (host['docker_image_first_commands'] || []).map { |cmd| "RUN #{cmd}\n" }.join('')
526
516
 
527
517
  # add platform-specific actions
528
- service_name = "sshd"
518
+ service_name = 'sshd'
529
519
  additional_packages = host_packages(host)
530
520
  case host['platform']
531
521
  when /ubuntu/, /debian/
532
- service_name = "ssh"
533
- dockerfile += <<~EOF
534
- RUN apt-get update
535
- RUN apt-get install -y openssh-server openssh-client #{additional_packages.join(' ')}
536
- RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
537
- EOF
538
- when /cumulus/
539
- dockerfile += <<~EOF
540
- RUN apt-get update
541
- RUN apt-get install -y openssh-server openssh-client #{additional_packages.join(' ')}
542
- EOF
522
+ service_name = 'ssh'
523
+ dockerfile += <<~DF
524
+ RUN apt-get update \
525
+ && apt-get install -y openssh-server openssh-client #{additional_packages.join(' ')} \
526
+ && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
527
+ DF
528
+ when /cumulus/
529
+ dockerfile += <<~DF
530
+ RUN apt-get update \
531
+ && apt-get install -y openssh-server openssh-client #{additional_packages.join(' ')}
532
+ DF
543
533
  when /el-[89]/, /fedora-(2[2-9]|3)/
544
- dockerfile += <<~EOF
545
- RUN dnf clean all
546
- RUN dnf install -y sudo openssh-server openssh-clients #{additional_packages.join(' ')}
547
- RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
548
- RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
549
- RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
550
- EOF
534
+ dockerfile += <<~DF
535
+ RUN dnf clean all \
536
+ && dnf install -y sudo openssh-server openssh-clients #{additional_packages.join(' ')} \
537
+ && ssh-keygen -A \
538
+ && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
539
+ DF
551
540
  when /^el-/, /centos/, /fedora/, /redhat/, /eos/
552
- dockerfile += <<~EOF
553
- RUN yum clean all
554
- RUN yum install -y sudo openssh-server openssh-clients #{additional_packages.join(' ')}
555
- RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
556
- RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
557
- RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
558
- EOF
541
+ dockerfile += <<~DF
542
+ RUN yum clean all \
543
+ && yum install -y sudo openssh-server openssh-clients #{additional_packages.join(' ')} \
544
+ && ssh-keygen -A \
545
+ && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
546
+ DF
559
547
  when /opensuse/, /sles/
560
- dockerfile += <<~EOF
561
- RUN zypper -n in openssh #{additional_packages.join(' ')}
562
- RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
563
- RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
564
- RUN sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config
565
- RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
566
- EOF
548
+ dockerfile += <<~DF
549
+ RUN zypper -n in openssh #{additional_packages.join(' ')} \
550
+ && ssh-keygen -A \
551
+ && sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config \
552
+ && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
553
+ DF
567
554
  when /archlinux/
568
- dockerfile += <<~EOF
569
- RUN pacman --sync --refresh --noconfirm archlinux-keyring
570
- RUN pacman --sync --refresh --noconfirm --sysupgrade
571
- RUN pacman --sync --noconfirm #{additional_packages.join(' ')}
572
- RUN ssh-keygen -A
573
- RUN sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config
574
- RUN systemctl enable sshd
575
- EOF
555
+ dockerfile += <<~DF
556
+ RUN pacman --sync --refresh --noconfirm archlinux-keyring \
557
+ && pacman --sync --refresh --noconfirm --sysupgrade \
558
+ && pacman --sync --noconfirm #{additional_packages.join(' ')} \
559
+ && ssh-keygen -A \
560
+ && sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config \
561
+ && systemctl enable sshd
562
+ DF
576
563
  else
577
- # TODO add more platform steps here
564
+ # TODO: add more platform steps here
578
565
  raise "platform #{host['platform']} not yet supported on docker"
579
566
  end
580
567
 
581
568
  # Make sshd directory, set root password
582
- dockerfile += <<~EOF
583
- RUN mkdir -p /var/run/sshd
584
- RUN echo root:#{root_password} | chpasswd
585
- EOF
569
+ dockerfile += <<~DF
570
+ RUN mkdir -p /var/run/sshd \
571
+ && echo root:#{root_password} | chpasswd
572
+ DF
586
573
 
587
574
  # Configure sshd service to allowroot login using password
588
575
  # Also, disable reverse DNS lookups to prevent every. single. ssh
589
576
  # operation taking 30 seconds while the lookup times out.
590
- dockerfile += <<~EOF
591
- RUN sed -ri 's/^#?PermitRootLogin .*/PermitRootLogin yes/' /etc/ssh/sshd_config
592
- RUN sed -ri 's/^#?PasswordAuthentication .*/PasswordAuthentication yes/' /etc/ssh/sshd_config
593
- RUN sed -ri 's/^#?UseDNS .*/UseDNS no/' /etc/ssh/sshd_config
594
- EOF
595
-
577
+ # Also unbreak users with a bunch of SSH keys loaded in their keyring.
578
+ dockerfile += <<~DF
579
+ RUN sed -ri \
580
+ -e 's/^#?PermitRootLogin .*/PermitRootLogin yes/' \
581
+ -e 's/^#?PasswordAuthentication .*/PasswordAuthentication yes/' \
582
+ -e 's/^#?UseDNS .*/UseDNS no/' \
583
+ -e 's/^#?MaxAuthTries.*/MaxAuthTries 1000/' \
584
+ /etc/ssh/sshd_config
585
+ DF
596
586
 
597
587
  # Any extra commands specified for the host
598
- dockerfile += (host['docker_image_commands'] || []).map { |command|
599
- "RUN #{command}\n"
600
- }.join('')
588
+ dockerfile += (host['docker_image_commands'] || []).map { |cmd| "RUN #{cmd}\n" }.join('')
601
589
 
602
590
  # Override image entrypoint
603
- if host['docker_image_entrypoint']
604
- dockerfile += "ENTRYPOINT #{host['docker_image_entrypoint']}\n"
605
- end
591
+ dockerfile += "ENTRYPOINT #{host['docker_image_entrypoint']}\n" if host['docker_image_entrypoint']
606
592
 
607
593
  # How to start a sshd on port 22. May be an init for more supervision
608
594
  # Ensure that the ssh server can be restarted (done from set_env) and container keeps running
609
- cmd = host['docker_cmd'] || ["sh","-c","service #{service_name} start ; tail -f /dev/null"]
610
- dockerfile += <<-EOF
595
+ cmd = host['docker_cmd'] || ['sh', '-c', "service #{service_name} start; tail -f /dev/null"]
596
+ dockerfile += <<~DF
611
597
  EXPOSE 22
612
598
  CMD #{cmd}
613
- EOF
614
-
615
- # end
599
+ DF
616
600
 
617
601
  @logger.debug("Dockerfile is #{dockerfile}")
618
- return dockerfile
602
+
603
+ dockerfile
619
604
  end
620
605
 
621
606
  # a puppet run may have changed the ssh config which would
622
607
  # keep us out of the container. This is a best effort to fix it.
623
608
  # Optionally pass in a host object to to determine which ssh
624
609
  # restart command we should try.
625
- def fix_ssh(container, host=nil)
610
+ def fix_ssh(container, host = nil)
626
611
  @logger.debug("Fixing ssh on container #{container.id}")
627
- container.exec(['sed','-ri',
628
- 's/^#?PermitRootLogin .*/PermitRootLogin yes/',
629
- '/etc/ssh/sshd_config'])
630
- container.exec(['sed','-ri',
631
- 's/^#?PasswordAuthentication .*/PasswordAuthentication yes/',
632
- '/etc/ssh/sshd_config'])
633
- container.exec(['sed','-ri',
634
- 's/^#?UseDNS .*/UseDNS no/',
635
- '/etc/ssh/sshd_config'])
636
- # Make sure users with a bunch of SSH keys loaded in their keyring can
637
- # still run tests
638
- container.exec(['sed','-ri',
639
- 's/^#?MaxAuthTries.*/MaxAuthTries 1000/',
640
- '/etc/ssh/sshd_config'])
641
-
642
- if host
643
- if host['platform'] =~ /alpine/
644
- container.exec(%w(/usr/sbin/sshd))
645
- else
646
- container.exec(%w(service ssh restart))
647
- end
612
+ container.exec(['sed', '-ri',
613
+ '-e', 's/^#?PermitRootLogin .*/PermitRootLogin yes/',
614
+ '-e', 's/^#?PasswordAuthentication .*/PasswordAuthentication yes/',
615
+ '-e', 's/^#?UseDNS .*/UseDNS no/',
616
+ # Unbreak users with a bunch of SSH keys loaded in their keyring.
617
+ '-e', 's/^#?MaxAuthTries.*/MaxAuthTries 1000/',
618
+ '/etc/ssh/sshd_config',])
619
+
620
+ return unless host
621
+
622
+ case host['platform']
623
+ when /alpine/
624
+ container.exec(%w[/usr/sbin/sshd])
625
+ when /ubuntu/, /debian/
626
+ container.exec(%w[service ssh restart])
627
+ else
628
+ container.exec(%w[service sshd restart])
648
629
  end
649
630
  end
650
631
 
651
-
652
632
  # return the existing container if we're not provisioning
653
633
  # and docker_container_name is set
654
634
  def find_container(host)
@@ -679,6 +659,5 @@ module Beaker
679
659
  def in_container?
680
660
  return File.file?('/.dockerenv')
681
661
  end
682
-
683
662
  end
684
663
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BeakerDocker
2
- VERSION = '1.3.0'
4
+ VERSION = '1.5.0'
3
5
  end
@@ -0,0 +1 @@
1
+ # frozen_string_literal: true