beaker-docker 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f21e88681130028d956057cc5d7e10242d3ab4b0dd3afdddc1e4a77b6a30376e
4
- data.tar.gz: 27f935f63ebaf20d0eb18afcab7360dccdb6cc7e037cee4d6e9e3a45aed9ef33
3
+ metadata.gz: d1f70940dc7c4b43db06838e143fc4e4a498247be0ed67ae0926ae84527f5786
4
+ data.tar.gz: b12830fb23b10ccf1718be061c3e6ffe3e81c0b47b3aff58e3882e2e0a843c7d
5
5
  SHA512:
6
- metadata.gz: 419eee4542d7283b98c1c9e56fae980816123bd5b4f8f69920180815c0ac61d047f0a8523ac68dc091e6bff6c101d8782905ec18d8a8d571274e62588872f58d
7
- data.tar.gz: 7aa8635232484d7b4ef171d1714ab59805cd82e1b8c0d44d70174b903805376cf08e8ce48030f33f0efeb8d4ce845b8f2ad6b0f3deeb30bef602ffa86b092387
6
+ metadata.gz: d182e05ba8dea02f896571bb5cf100f3a313349e1178f3eb9daf5e62f7ec93572114e4e1cf6e10a34aa18e8280d7be0ff7ed8a1482984cbd07ae3a530a7a0be9
7
+ data.tar.gz: 478ac68e7088d66a8f5a4732f59a1337b355293b5a5f8d38551e5d54b81e6e7634528139b4c5717462b3d0b4a8558de05afc83b2f2c51705f0e8d16b7fb885a8
@@ -0,0 +1,24 @@
1
+ name: Release
2
+
3
+ on:
4
+ create:
5
+ ref_type: tag
6
+
7
+ jobs:
8
+ release:
9
+ runs-on: ubuntu-latest
10
+ if: github.repository == 'voxpupuli/beaker-docker'
11
+ env:
12
+ BUNDLE_WITHOUT: release
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+ - name: Install Ruby 2.7
16
+ uses: ruby/setup-ruby@v1
17
+ with:
18
+ ruby-version: '2.7'
19
+ - name: Build gem
20
+ run: gem build *.gemspec
21
+ - name: Publish gem
22
+ run: gem push *.gem
23
+ env:
24
+ GEM_HOST_API_KEY: '${{ secrets.RUBYGEMS_AUTH_TOKEN }}'
@@ -1,13 +1,19 @@
1
1
  name: Test
2
2
 
3
3
  on:
4
- - pull_request
4
+ push:
5
+ branches:
6
+ - test_me_github
7
+ pull_request:
8
+ branches:
9
+ - main
10
+ - master
5
11
 
6
12
  jobs:
7
- test:
13
+ rspec:
8
14
  runs-on: ubuntu-latest
9
15
  strategy:
10
- fail-fast: false
16
+ fail-fast: true
11
17
  matrix:
12
18
  ruby:
13
19
  - "2.4"
@@ -16,7 +22,7 @@ jobs:
16
22
  - "2.7"
17
23
  env:
18
24
  BUNDLE_WITHOUT: release
19
- name: Ruby ${{ matrix.ruby }}
25
+ name: RSpec - Ruby ${{ matrix.ruby }}
20
26
  steps:
21
27
  - uses: actions/checkout@v2
22
28
  - name: Install Ruby ${{ matrix.ruby }}
@@ -24,9 +30,76 @@ jobs:
24
30
  with:
25
31
  ruby-version: ${{ matrix.ruby }}
26
32
  bundler-cache: true
27
- - name: Run spec tests
33
+ - name: install bundler
34
+ run: |
35
+ gem install bundler -v '~> 1.17.3'
36
+ bundle update
37
+ - name: spec tests
28
38
  run: bundle exec rake test:spec
29
- # It seems some additonal setup of Docker may be needed for
30
- # the acceptance tests to work.
31
- # - name: Run acceptance tests
32
- # run: bundle exec rake test:acceptance
39
+
40
+ docker:
41
+ runs-on: ubuntu-latest
42
+ strategy:
43
+ fail-fast: true
44
+ matrix:
45
+ ruby:
46
+ - "2.6"
47
+ env:
48
+ BUNDLE_WITHOUT: release
49
+ name: Docker - Ruby ${{ matrix.ruby }}
50
+ steps:
51
+ - uses: actions/checkout@v2
52
+ - name: Install Ruby ${{ matrix.ruby }}
53
+ uses: ruby/setup-ruby@v1
54
+ with:
55
+ ruby-version: ${{ matrix.ruby }}
56
+ bundler-cache: true
57
+ - name: install bundler
58
+ run: |
59
+ gem install bundler -v '~> 1.17.3'
60
+ bundle update
61
+ - name: install container runtime
62
+ run: |
63
+ sudo apt-get remove -y docker docker-engine docker.io containerd runc ||:
64
+ sudo apt-get update -y
65
+ sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
66
+ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
67
+ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
68
+ sudo apt-get update -y
69
+ sudo apt-get install -y docker-ce docker-ce-cli containerd.io
70
+ sudo systemctl start docker
71
+ - name: Run acceptance tests
72
+ run: bundle exec rake test:acceptance
73
+
74
+ podman:
75
+ runs-on: ubuntu-latest
76
+ strategy:
77
+ fail-fast: true
78
+ matrix:
79
+ ruby:
80
+ - "2.6"
81
+ env:
82
+ BUNDLE_WITHOUT: release
83
+ name: Podman - Ruby ${{ matrix.ruby }}
84
+ steps:
85
+ - uses: actions/checkout@v2
86
+ - name: Install Ruby ${{ matrix.ruby }}
87
+ uses: ruby/setup-ruby@v1
88
+ with:
89
+ ruby-version: ${{ matrix.ruby }}
90
+ bundler-cache: true
91
+ - name: install bundler
92
+ run: |
93
+ gem install bundler -v '~> 1.17.3'
94
+ bundle update
95
+ # We need the latest version of podman for this to work
96
+ - name: install container runtime
97
+ run: |
98
+ . /etc/os-release
99
+ curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -
100
+ echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/podman.list > /dev/null
101
+ sudo apt-get update
102
+ sudo apt-get -y install podman
103
+ sudo systemctl start podman
104
+ - name: Run acceptance tests
105
+ run: bundle exec rake test:acceptance
data/Gemfile.local ADDED
@@ -0,0 +1,5 @@
1
+ group :acceptance_testing do
2
+ # Needed for podman testing
3
+ gem "docker-api", :git => 'https://github.com/trevor-vaughan/docker-api', :branch => 'podman-compat'
4
+ gem "beaker-rspec"
5
+ end
data/Rakefile CHANGED
@@ -32,11 +32,15 @@ A quick acceptance test, named because it has no pre-suites to run
32
32
  beaker_test_base_dir = File.join(beaker_gem_dir, 'acceptance/tests/base')
33
33
  load_path_option = File.join(beaker_gem_dir, 'acceptance/lib')
34
34
 
35
+ ENV['BEAKER_setfile'] = 'acceptance/config/nodes/hosts.yaml'
35
36
  sh("beaker",
36
37
  "--hosts", "acceptance/config/nodes/hosts.yaml",
37
- "--tests", beaker_test_base_dir,
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/',
38
43
  "--log-level", "debug",
39
- "--load-path", load_path_option,
40
44
  "--debug")
41
45
  end
42
46
 
@@ -12,12 +12,6 @@ HOSTS:
12
12
  - classifier
13
13
  - default
14
14
  docker_cmd: '["/sbin/init"]'
15
- docker_cap_add:
16
- - AUDIT_WRITE
17
- dockeropts:
18
- Labels:
19
- one: '1'
20
- two: '2'
21
15
  centos7:
22
16
  platform: el-7-x86_64
23
17
  hypervisor: docker
@@ -26,10 +20,21 @@ HOSTS:
26
20
  - agent
27
21
  docker_cmd: '/usr/sbin/sshd -D -E /var/log/sshd.log'
28
22
  use_image_entrypoint: true
29
- dockeropts:
30
- HostConfig:
31
- Privileged: true
32
23
  CONFIG:
33
24
  nfs_server: none
34
25
  consoleport: 443
35
26
  log_level: verbose
27
+ # Ubuntu runners need to run with full privileges
28
+ # RHEL derivitives just need the docker cap AUDIT_WRITE
29
+ dockeropts:
30
+ HostConfig:
31
+ Privileged: true
32
+ # docker_cap_add:
33
+ # - AUDIT_WRITE
34
+ type: aio
35
+ ssh:
36
+ verify_host_key: false
37
+ user_known_hosts_file: '/dev/null'
38
+ password: root
39
+ auth_methods:
40
+ - password
@@ -0,0 +1,10 @@
1
+ require 'beaker'
2
+ require 'beaker-rspec'
3
+
4
+ RSpec.describe 'it can connect' do
5
+ hosts.each do |host|
6
+ context "on #{host}" do
7
+ on(host, 'ls /tmp')
8
+ end
9
+ end
10
+ end
@@ -1,3 +1,3 @@
1
1
  module BeakerDocker
2
- VERSION = '0.8.0'
2
+ VERSION = '0.8.1'
3
3
  end
@@ -135,32 +135,35 @@ module Beaker
135
135
  port: nil
136
136
  }
137
137
 
138
+ container_json = container.json
139
+ network_settings = container_json['NetworkSettings']
140
+ host_config = container_json['HostConfig']
141
+
142
+ ip = nil
143
+ port = nil
138
144
  # Talking against a remote docker host which is a normal docker host
139
145
  if @docker_type == 'docker' && ENV['DOCKER_HOST'] && !ENV.fetch('DOCKER_HOST','').include?(':///')
140
146
  ip = URI.parse(ENV['DOCKER_HOST']).host
141
147
  else
142
148
  # Swarm or local docker host
143
149
  if in_container?
144
- ip = container.json["NetworkSettings"]["Gateway"]
150
+ gw = network_settings['Gateway']
151
+ ip = gw unless (gw.nil? || gw.empty?)
145
152
  else
146
- ip = container.json["NetworkSettings"]["Ports"]["22/tcp"][0]["HostIp"]
153
+ port22 = network_settings.dig('Ports','22/tcp')
154
+ ip = port22[0]["HostIp"] if port22
147
155
  end
148
156
  end
149
157
 
150
- network_settings = container.json['NetworkSettings']
151
- host_config = container.json['HostConfig']
152
-
153
- port = '22'
154
- if host_config['NetworkMode'] == 'bridge' && network_settings['IPAddress'] && !network_settings['IPAddress'].empty?
155
- ssh_connection_info[:ip] = network_settings['IPAddress']
158
+ if host_config['NetworkMode'] != 'slirp4netns' && network_settings['IPAddress'] && !network_settings['IPAddress'].empty?
159
+ ip = network_settings['IPAddress']
156
160
  else
157
- port = network_settings['Ports']['22/tcp'][0]['HostPort']
158
-
159
- # Update host metadata
160
- ssh_connection_info[:ip] = (ip == '0.0.0.0') ? '127.0.0.1' : ip
161
+ port22 = network_settings.dig('Ports','22/tcp')
162
+ port = port22[0]['HostPort'] if port22
161
163
  end
162
164
 
163
- ssh_connection_info[:port] = port
165
+ ssh_connection_info[:ip] = (ip == '0.0.0.0') ? '127.0.0.1' : ip
166
+ ssh_connection_info[:port] = port || '22'
164
167
  ssh_connection_info
165
168
  end
166
169
 
@@ -242,7 +245,8 @@ module Beaker
242
245
  while(!ok && (retries < 5))
243
246
  container = ::Docker::Container.create(container_opts)
244
247
 
245
- if (get_ssh_connection_info(container)[:port].to_i < 1024) && (Process.uid != 0)
248
+ ssh_info = get_ssh_connection_info(container)
249
+ if ssh_info[:ip] == '127.0.0.1' && (ssh_info[:port].to_i < 1024) && (Process.uid != 0)
246
250
  @logger.debug("#{host} was given a port less than 1024 but you are not running as root, retrying")
247
251
 
248
252
  container.delete
@@ -267,19 +271,19 @@ module Beaker
267
271
  @logger.debug("Starting container #{container.id}")
268
272
  container.start
269
273
 
274
+ begin
275
+ container.stats
276
+ rescue StandardError => e
277
+ container.delete
278
+ raise "Container '#{container.id}' in a bad state: #{e}"
279
+ end
280
+
270
281
  # Preserve the ability to talk directly to the underlying API
271
282
  #
272
283
  # You can use any method defined by the docker-api gem on this object
273
284
  # https://github.com/swipely/docker-api
274
285
  host[:docker_container] = container
275
286
 
276
- ssh_connection_info = get_ssh_connection_info(container)
277
-
278
- ip = ssh_connection_info[:ip]
279
- port = ssh_connection_info[:port]
280
-
281
- @logger.info("Using container connection at #{ip}:#{port}")
282
-
283
287
  if install_and_run_ssh(host)
284
288
  @logger.notify("Installing ssh components and starting ssh daemon in #{host} container")
285
289
  install_ssh_components(container, host)
@@ -287,6 +291,13 @@ module Beaker
287
291
  fix_ssh(container, host)
288
292
  end
289
293
 
294
+ ssh_connection_info = get_ssh_connection_info(container)
295
+
296
+ ip = ssh_connection_info[:ip]
297
+ port = ssh_connection_info[:port]
298
+
299
+ @logger.info("Using container connection at #{ip}:#{port}")
300
+
290
301
  forward_ssh_agent = @options[:forward_ssh_agent] || false
291
302
 
292
303
  host['ip'] = ip
@@ -298,7 +309,7 @@ module Beaker
298
309
  :auth_methods => ['password', 'publickey', 'hostbased', 'keyboard-interactive']
299
310
  }
300
311
 
301
- @logger.debug("node available as ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@#{ip} -p #{port}")
312
+ @logger.debug("node available as ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@#{ip} -p #{port}")
302
313
  host['docker_container_id'] = container.id
303
314
  host['docker_image_id'] = image.id
304
315
  host['vm_ip'] = container.json["NetworkSettings"]["IPAddress"].to_s
@@ -88,6 +88,7 @@ module Beaker
88
88
  container = double('Docker::Container')
89
89
  allow( container ).to receive(:id).and_return('abcdef')
90
90
  allow( container ).to receive(:start)
91
+ allow( container ).to receive(:stats)
91
92
  allow( container ).to receive(:info).and_return(
92
93
  *(0..2).map { |index| { 'Names' => ["/spec-container-#{index}"] } }
93
94
  )
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beaker-docker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rishi Javia, Kevin Imber, Tony Vu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-26 00:00:00.000000000 Z
11
+ date: 2021-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -131,14 +131,17 @@ extensions: []
131
131
  extra_rdoc_files: []
132
132
  files:
133
133
  - ".github/dependabot.yml"
134
+ - ".github/workflows/release.yml"
134
135
  - ".github/workflows/test.yml"
135
136
  - ".gitignore"
136
137
  - ".simplecov"
137
138
  - Gemfile
139
+ - Gemfile.local
138
140
  - LICENSE
139
141
  - README.md
140
142
  - Rakefile
141
143
  - acceptance/config/nodes/hosts.yaml
144
+ - acceptance/tests/00_default_spec.rb
142
145
  - beaker-docker.gemspec
143
146
  - bin/beaker-docker
144
147
  - docker.md
@@ -165,7 +168,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
168
  - !ruby/object:Gem::Version
166
169
  version: '0'
167
170
  requirements: []
168
- rubygems_version: 3.0.8
171
+ rubygems_version: 3.1.4
169
172
  signing_key:
170
173
  specification_version: 4
171
174
  summary: Beaker DSL Extension Helpers!