gitlab-qa 5.13.5 → 5.13.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 176ad29bc36b0c276fd9f0addab99fbc57b3cfc7cc4edec364921e7b2ed9d80a
4
- data.tar.gz: 3cd4551211e72968b2403f58e3f0583f588cc3f4496e7da8fc31cd484e6ba013
3
+ metadata.gz: 742350ecaafcf21ca9ff0fc50547cbb6cd28b2cf7a3fc090f5cb6ab542da3154
4
+ data.tar.gz: e65a23e2620961c5751eca131cf0dfa4b639f2915488b888975e6a0313c8baee
5
5
  SHA512:
6
- metadata.gz: 64f2a6f26ade53e538405d3f4f4a7d516205079add946969f2855a27a36e217b93dc6793b5bb2e1365edf0820518ed2e2510a46295903c44099b5fc8d829e652
7
- data.tar.gz: f034880d5eee0b1f00b1ab9a60394203cfbd05d0d895f0a26b782f22baec0634880007be944a53a6aa565db908a064a04442041f02f7735fd4f7f83859f9c02d
6
+ metadata.gz: e42ac20b6a9dd4881c50d5018956241543395dae6c2aac148c1db87e77daa0ac677950a876ffa730e9d8f991c3850640775213ca6a0c8ebefa4a45dd2ab811c2
7
+ data.tar.gz: b7f993786ae4ac8fdc7b15d4d936cad11066e2f92731b30f696e8615a9454657f40d67e3cccb9074b6464755ab2d37a2e74569e92b66476328ee8215ea4543e3
@@ -69,7 +69,7 @@ For more details on the internals, please read the
69
69
  | `QA_SIMULATE_SLOW_CONNECTION` |- | Set to `true` to configure Chrome's network settings to simulate a slow connection. | No|
70
70
  | `QA_SLOW_CONNECTION_LATENCY_MS` | `2000` | The additional latency (in ms) of the simulated slow connection. | No|
71
71
  | `QA_SLOW_CONNECTION_THROUGHPUT_KBPS` | `32` | The maximum throughput (in kbps) of the simulated slow connection. | No|
72
- | `QA_SKIP_PULL` | `false` | Set to `true` to skip pulling docker images (e.g., to use one you built locally). | No|
72
+ | `QA_SKIP_PULL` |- | Set to `true` to skip pulling docker images (e.g., to use one you built locally). | No|
73
73
  | `GITHUB_USERNAME` |- | Username for authenticating with GitHub. | No|
74
74
  | `GITHUB_PASSWORD` |- | Password for authenticating with GitHub. | No|
75
75
  | `GITLAB_QA_LOOP_RUNNER_MINUTES` | `1` | Minutes to run and repeat a spec while using the '--loop' option; default value is 1 minute. | No|
@@ -6,7 +6,6 @@ module Gitlab
6
6
 
7
7
  module Runtime
8
8
  autoload :Env, 'gitlab/qa/runtime/env'
9
- autoload :Scenario, 'gitlab/qa/runtime/scenario'
10
9
  autoload :TokenFinder, 'gitlab/qa/runtime/token_finder'
11
10
  end
12
11
 
@@ -64,7 +63,6 @@ module Gitlab
64
63
  end
65
64
 
66
65
  module Component
67
- autoload :Base, 'gitlab/qa/component/base'
68
66
  autoload :Gitlab, 'gitlab/qa/component/gitlab'
69
67
  autoload :InternetTunnel, 'gitlab/qa/component/internet_tunnel'
70
68
  autoload :LDAP, 'gitlab/qa/component/ldap'
@@ -1,19 +1,41 @@
1
1
  module Gitlab
2
2
  module QA
3
3
  module Component
4
- class Elasticsearch < Base
5
- DOCKER_IMAGE = 'docker.elastic.co/elasticsearch/elasticsearch'.freeze
4
+ class Elasticsearch
5
+ include Scenario::Actable
6
+
7
+ ELASTIC_IMAGE = 'docker.elastic.co/elasticsearch/elasticsearch'.freeze
8
+
9
+ attr_reader :docker
10
+ attr_accessor :environment, :network
11
+ attr_writer :name
12
+
13
+ def initialize
14
+ @docker = Docker::Engine.new
15
+ @environment = {}
16
+ end
6
17
 
7
18
  def name
8
19
  @name ||= "elastic68"
9
20
  end
10
21
 
11
- def tag
12
- Runtime::Env.elastic_version
22
+ def instance
23
+ prepare
24
+ start
25
+ yield self
26
+ ensure
27
+ teardown
28
+ end
29
+
30
+ def prepare
31
+ @docker.pull(ELASTIC_IMAGE, Runtime::Env.elastic_version)
32
+ return if @docker.network_exists?(network)
33
+
34
+ @docker.network_create(network)
13
35
  end
14
36
 
15
37
  def start
16
- @docker.run(image, tag) do |command|
38
+ @docker.run(ELASTIC_IMAGE, Runtime::Env.elastic_version) do |command|
17
39
  command << "-d"
18
40
  command << "--name #{name}"
19
41
  command << "--net #{network}"
@@ -23,6 +45,11 @@ module Gitlab
23
45
  command.env("discovery.type", "single-node")
24
46
  end
25
47
  end
48
+
49
+ def teardown
50
+ @docker.stop(name)
51
+ @docker.remove(name)
52
+ end
26
53
  end
27
54
  end
28
55
  end
@@ -7,12 +7,13 @@ require 'openssl'
7
7
  module Gitlab
8
8
  module QA
9
9
  module Component
10
- class Gitlab < Base
10
+ class Gitlab
11
11
  extend Forwardable
12
+ include Scenario::Actable
12
13
 
13
- attr_reader :release
14
- attr_accessor :tls, :disable_animations, :skip_availability_check
15
- attr_writer :name, :relative_path
14
+ attr_reader :release, :docker
15
+ attr_accessor :volumes, :network, :environment, :tls, :disable_animations
16
+ attr_writer :name, :relative_path, :exec_commands, :skip_check
16
17
 
17
18
  def_delegators :release, :tag, :image, :edition
18
19
 
@@ -20,14 +21,17 @@ module Gitlab
20
21
  SSL_PATH = '/etc/gitlab/ssl'.freeze
21
22
 
22
23
  def initialize
23
- super
24
-
24
+ @docker = Docker::Engine.new
25
+ @environment = {}
26
+ @volumes = {}
27
+ @network_aliases = []
25
28
  @disable_animations = true
26
- @skip_availability_check = false
29
+ @skip_check = false
27
30
 
28
31
  @volumes[CERTIFICATES_PATH] = SSL_PATH
29
32
 
30
33
  self.release = 'CE'
34
+ self.exec_commands = []
31
35
  end
32
36
 
33
37
  def omnibus_config=(config)
@@ -44,6 +48,10 @@ module Gitlab
44
48
  @environment['ELASTIC_URL'] = url
45
49
  end
46
50
 
51
+ def add_network_alias(name)
52
+ @network_aliases.push(name)
53
+ end
54
+
47
55
  def release=(release)
48
56
  @release = QA::Release.new(release)
49
57
  end
@@ -64,6 +72,10 @@ module Gitlab
64
72
  tls ? '443' : '80'
65
73
  end
66
74
 
75
+ def hostname
76
+ "#{name}.#{network}"
77
+ end
78
+
67
79
  def relative_path
68
80
  @relative_path ||= ''
69
81
  end
@@ -72,16 +84,24 @@ module Gitlab
72
84
  Runtime::Env.accept_insecure_certs = 'true'
73
85
  end
74
86
 
75
- def prepare
76
- prepare_gitlab_omnibus_config
87
+ def instance
88
+ prepare
89
+ start
90
+ reconfigure
91
+ wait unless @skip_check
92
+ process_exec_commands
77
93
 
78
- super
94
+ yield self if block_given?
95
+ ensure
96
+ teardown
79
97
  end
80
98
 
81
- def pull
82
- docker.login(**release.login_params) if release.login_params
99
+ alias_method :launch_and_teardown_instance, :instance
83
100
 
84
- super
101
+ def prepare
102
+ prepare_gitlab_omnibus_config
103
+ prepare_docker_image
104
+ prepare_network
85
105
  end
86
106
 
87
107
  def prepare_gitlab_omnibus_config
@@ -89,6 +109,18 @@ module Gitlab
89
109
  set_formless_login_token
90
110
  end
91
111
 
112
+ def prepare_docker_image
113
+ return if Runtime::Env.skip_pull?
114
+
115
+ @docker.pull(image, tag)
116
+ end
117
+
118
+ def prepare_network
119
+ return if @docker.network_exists?(network)
120
+
121
+ @docker.network_create(network)
122
+ end
123
+
92
124
  def setup_disable_animations
93
125
  @environment['GITLAB_OMNIBUS_CONFIG'] = "gitlab_rails['gitlab_disable_animations'] = true; #{@environment['GITLAB_OMNIBUS_CONFIG'] || ''}"
94
126
  end
@@ -96,6 +128,28 @@ module Gitlab
96
128
  def start # rubocop:disable Metrics/AbcSize
97
129
  ensure_configured!
98
130
 
131
+ if release.dev_gitlab_org?
132
+ Docker::Command.execute(
133
+ [
134
+ 'login',
135
+ '--username gitlab-qa-bot',
136
+ %(--password "#{Runtime::Env.dev_access_token_variable}"),
137
+ QA::Release::DEV_REGISTRY
138
+ ]
139
+ )
140
+ elsif release.omnibus_mirror?
141
+ bot_token = ENV['GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN']
142
+
143
+ Docker::Command.execute(
144
+ [
145
+ 'login',
146
+ '--username gitlab-bot',
147
+ %(--password "#{bot_token}"),
148
+ QA::Release::COM_REGISTRY
149
+ ]
150
+ )
151
+ end
152
+
99
153
  docker.run(image, tag) do |command|
100
154
  command << "-d -p #{port}"
101
155
  command << "--name #{name}"
@@ -127,9 +181,18 @@ module Gitlab
127
181
  end
128
182
  end
129
183
 
130
- def wait
131
- return if skip_availability_check
184
+ def restart
185
+ @docker.restart(name)
186
+ end
187
+
188
+ def teardown
189
+ raise 'Invalid instance name!' unless name
190
+
191
+ @docker.stop(name)
192
+ @docker.remove(name)
193
+ end
132
194
 
195
+ def wait
133
196
  if Availability.new(name, relative_path: relative_path, scheme: scheme, protocol_port: port.to_i).check(180)
134
197
  sleep 12 # TODO, handle that better
135
198
  puts ' -> GitLab is available.'
@@ -138,6 +201,10 @@ module Gitlab
138
201
  end
139
202
  end
140
203
 
204
+ def pull
205
+ @docker.pull(@release.image, @release.tag)
206
+ end
207
+
141
208
  def sha_version
142
209
  json = @docker.read_file(
143
210
  @release.image, @release.tag,
@@ -148,8 +215,14 @@ module Gitlab
148
215
  manifest['software']['gitlab-rails']['locked_version']
149
216
  end
150
217
 
218
+ def process_exec_commands
219
+ exec_commands.each { |command| @docker.exec(name, command) }
220
+ end
221
+
151
222
  private
152
223
 
224
+ attr_reader :exec_commands
225
+
153
226
  def ensure_configured!
154
227
  raise 'Please configure an instance first!' unless [name, release, network].all?
155
228
  end
@@ -3,14 +3,18 @@ require 'tempfile'
3
3
  module Gitlab
4
4
  module QA
5
5
  module Component
6
- class InternetTunnel < Base
6
+ class InternetTunnel
7
+ include Scenario::Actable
8
+
7
9
  DOCKER_IMAGE = 'gitlab/ssh-tunnel'.freeze
8
10
  DOCKER_IMAGE_TAG = '1.0.0'.freeze
9
11
 
10
- attr_writer :gitlab_hostname
12
+ attr_writer :gitlab_hostname, :name
13
+ attr_accessor :network
11
14
 
12
15
  def initialize
13
- super
16
+ @docker = Docker::Engine.new
17
+ @volumes = {}
14
18
 
15
19
  key_dir = ENV['CI_PROJECT_DIR'] || Dir.tmpdir
16
20
  @ssh_key = Tempfile.new('tunnel-ssh-private-key', key_dir)
@@ -23,9 +27,14 @@ module Gitlab
23
27
  end
24
28
 
25
29
  def instance
26
- raise 'Please provide a block!' unless block_given?
30
+ raise ArgumentError, 'Please provide a block!' unless block_given?
31
+
32
+ prepare
33
+ start
27
34
 
28
- super
35
+ yield self
36
+ ensure
37
+ teardown
29
38
  end
30
39
 
31
40
  def url
@@ -38,6 +47,14 @@ module Gitlab
38
47
  @name ||= "ssh-tunnel-#{SecureRandom.hex(4)}"
39
48
  end
40
49
 
50
+ def prepare
51
+ @docker.pull(DOCKER_IMAGE, DOCKER_IMAGE_TAG)
52
+
53
+ return if @docker.network_exists?(network)
54
+
55
+ @docker.network_create(network)
56
+ end
57
+
41
58
  def tunnel_server_hostname
42
59
  ENV.fetch("TUNNEL_SERVER_HOSTNAME")
43
60
  end
@@ -60,9 +77,15 @@ module Gitlab
60
77
  end
61
78
  end
62
79
 
80
+ def restart
81
+ @docker.restart(name)
82
+ end
83
+
63
84
  def teardown
64
- super
85
+ raise 'Invalid instance name!' unless name
65
86
 
87
+ @docker.stop(name)
88
+ @docker.remove(name)
66
89
  @ssh_key.unlink
67
90
  end
68
91
  end
@@ -1,22 +1,50 @@
1
1
  module Gitlab
2
2
  module QA
3
3
  module Component
4
- class Jira < Base
5
- DOCKER_IMAGE = 'registry.gitlab.com/gitlab-org/gitlab-qa/jira-gitlab'.freeze
6
- DOCKER_IMAGE_TAG = '8.8-project-and-issue'.freeze
4
+ class Jira
5
+ include Scenario::Actable
6
+
7
+ JIRA_IMAGE = 'registry.gitlab.com/gitlab-org/gitlab-qa/jira-gitlab'.freeze
8
+ JIRA_IMAGE_TAG = '8.8-project-and-issue'.freeze
9
+
10
+ attr_reader :docker
11
+ attr_accessor :environment, :network
12
+ attr_writer :name
13
+
14
+ def initialize
15
+ @docker = Docker::Engine.new
16
+ @environment = {}
17
+ end
7
18
 
8
19
  def name
9
20
  @name ||= "jira"
10
21
  end
11
22
 
23
+ def hostname
24
+ "#{name}.#{network}"
25
+ end
26
+
12
27
  def instance
13
28
  raise 'Please provide a block!' unless block_given?
14
29
 
15
- super
30
+ prepare
31
+ start
32
+
33
+ yield self
34
+ ensure
35
+ teardown
36
+ end
37
+
38
+ def prepare
39
+ @docker.pull(JIRA_IMAGE, JIRA_IMAGE_TAG)
40
+
41
+ return if @docker.network_exists?(network)
42
+
43
+ @docker.network_create(network)
16
44
  end
17
45
 
18
46
  def start
19
- docker.run(image, tag) do |command|
47
+ docker.run(JIRA_IMAGE, JIRA_IMAGE_TAG) do |command|
20
48
  command << '-d '
21
49
  command << "--name #{name}"
22
50
  command << "--net #{network}"
@@ -25,6 +53,17 @@ module Gitlab
25
53
  end
26
54
  end
27
55
 
56
+ def restart
57
+ @docker.restart(name)
58
+ end
59
+
60
+ def teardown
61
+ raise 'Invalid instance name!' unless name
62
+
63
+ @docker.stop(name)
64
+ @docker.remove(name)
65
+ end
66
+
28
67
  def set_jira_hostname
29
68
  ::Gitlab::QA::Runtime::Env.jira_hostname = hostname
30
69
  end
@@ -15,16 +15,25 @@ require 'securerandom'
15
15
  module Gitlab
16
16
  module QA
17
17
  module Component
18
- class LDAP < Base
19
- DOCKER_IMAGE = 'osixia/openldap'.freeze
20
- DOCKER_IMAGE_TAG = 'latest'.freeze
18
+ class LDAP
19
+ include Scenario::Actable
20
+
21
+ LDAP_IMAGE = 'osixia/openldap'.freeze
22
+ LDAP_IMAGE_TAG = 'latest'.freeze
21
23
  LDAP_USER = 'tanuki'.freeze
22
24
  LDAP_PASSWORD = 'password'.freeze
23
25
  BOOTSTRAP_LDIF = '/container/service/slapd/assets/config/bootstrap/ldif/custom'.freeze
24
26
  FIXTURE_PATH = File.expand_path('../../../../fixtures/ldap'.freeze, __dir__)
25
27
 
28
+ attr_reader :docker
29
+ attr_accessor :volumes, :network, :environment
30
+ attr_writer :name
31
+
26
32
  def initialize
27
- super
33
+ @docker = Docker::Engine.new
34
+ @environment = {}
35
+ @volumes = {}
36
+ @network_aliases = []
28
37
 
29
38
  @volumes[FIXTURE_PATH] = BOOTSTRAP_LDIF
30
39
  end
@@ -49,21 +58,41 @@ module Gitlab
49
58
  LDAP_PASSWORD
50
59
  end
51
60
 
61
+ def add_network_alias(name)
62
+ @network_aliases.push(name)
63
+ end
64
+
52
65
  def name
53
66
  @name ||= "openldap-#{SecureRandom.hex(4)}"
54
67
  end
55
68
 
69
+ def hostname
70
+ "#{name}.#{network}"
71
+ end
72
+
56
73
  def instance
57
74
  raise 'Please provide a block!' unless block_given?
58
75
 
59
- super
76
+ prepare
77
+ start
78
+
79
+ yield self
80
+ ensure
81
+ teardown
82
+ end
83
+
84
+ def prepare
85
+ @docker.pull(LDAP_IMAGE, LDAP_IMAGE_TAG)
86
+
87
+ return if @docker.network_exists?(network)
88
+
89
+ @docker.network_create(network)
60
90
  end
61
91
 
62
- # rubocop:disable Metrics/AbcSize
63
92
  def start
64
93
  # copy-service needed for bootstraping LDAP user:
65
94
  # https://github.com/osixia/docker-openldap#seed-ldap-database-with-ldif
66
- docker.run(image, tag, '--copy-service') do |command|
95
+ docker.run(LDAP_IMAGE, LDAP_IMAGE_TAG, '--copy-service') do |command|
67
96
  command << '-d '
68
97
  command << "--name #{name}"
69
98
  command << "--net #{network}"
@@ -82,7 +111,21 @@ module Gitlab
82
111
  end
83
112
  end
84
113
  end
85
- # rubocop:enable Metrics/AbcSize
114
+
115
+ def restart
116
+ @docker.restart(name)
117
+ end
118
+
119
+ def teardown
120
+ raise 'Invalid instance name!' unless name
121
+
122
+ @docker.stop(name)
123
+ @docker.remove(name)
124
+ end
125
+
126
+ def pull
127
+ @docker.pull(LDAP_IMAGE, LDAP_IMAGE_TAG)
128
+ end
86
129
 
87
130
  def set_gitlab_credentials
88
131
  ::Gitlab::QA::Runtime::Env.ldap_username = username
@@ -4,22 +4,50 @@
4
4
  module Gitlab
5
5
  module QA
6
6
  module Component
7
- class MailHog < Base
8
- DOCKER_IMAGE = 'mailhog/mailhog'.freeze
9
- DOCKER_IMAGE_TAG = 'v1.0.0'.freeze
7
+ class MailHog
8
+ include Scenario::Actable
9
+
10
+ MAILHOG_IMAGE = 'mailhog/mailhog'.freeze
11
+ MAILHOG_IMAGE_TAG = 'v1.0.0'.freeze
12
+
13
+ attr_reader :docker
14
+ attr_accessor :environment, :network
15
+ attr_writer :name
16
+
17
+ def initialize
18
+ @docker = Docker::Engine.new
19
+ @environment = {}
20
+ end
10
21
 
11
22
  def name
12
23
  @name ||= "mailhog"
13
24
  end
14
25
 
26
+ def hostname
27
+ "#{name}.#{network}"
28
+ end
29
+
15
30
  def instance
16
31
  raise 'Please provide a block!' unless block_given?
17
32
 
18
- super
33
+ prepare
34
+ start
35
+
36
+ yield self
37
+ ensure
38
+ teardown
39
+ end
40
+
41
+ def prepare
42
+ @docker.pull(MAILHOG_IMAGE, MAILHOG_IMAGE_TAG)
43
+
44
+ return if @docker.network_exists?(network)
45
+
46
+ @docker.network_create(network)
19
47
  end
20
48
 
21
49
  def start
22
- docker.run(image, tag) do |command|
50
+ docker.run(MAILHOG_IMAGE, MAILHOG_IMAGE_TAG) do |command|
23
51
  command << '-d '
24
52
  command << "--name #{name}"
25
53
  command << "--net #{network}"
@@ -29,6 +57,17 @@ module Gitlab
29
57
  end
30
58
  end
31
59
 
60
+ def restart
61
+ @docker.restart(name)
62
+ end
63
+
64
+ def teardown
65
+ raise 'Invalid instance name!' unless name
66
+
67
+ @docker.stop(name)
68
+ @docker.remove(name)
69
+ end
70
+
32
71
  def set_mailhog_hostname
33
72
  ::Gitlab::QA::Runtime::Env.mailhog_hostname = hostname
34
73
  end
@@ -6,18 +6,23 @@ require 'fileutils'
6
6
  module Gitlab
7
7
  module QA
8
8
  module Component
9
- class Minio < Base
10
- DOCKER_IMAGE = 'minio/minio'.freeze
11
- DOCKER_IMAGE_TAG = 'latest'.freeze
9
+ class Minio
10
+ include Scenario::Actable
11
+
12
+ MINIO_IMAGE = 'minio/minio'.freeze
13
+ MINIO_IMAGE_TAG = 'latest'.freeze
12
14
  # These are secrets used in a local Minio container, they're not used for any online S3 server.
13
15
  AWS_ACCESS_KEY = 'AKIAIOSFODNN7EXAMPLE'.freeze
14
16
  AWS_SECRET_KEY = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'.freeze
15
17
  DATA_DIR = '/data'.freeze
16
18
  DEFAULT_PORT = 9000
17
19
 
18
- def initialize
19
- super
20
+ attr_reader :docker
21
+ attr_accessor :volumes, :network, :environment
22
+ attr_writer :name
20
23
 
24
+ def initialize
25
+ @docker = Docker::Engine.new
21
26
  @environment = { MINIO_ACCESS_KEY: AWS_ACCESS_KEY, MINIO_SECRET_KEY: AWS_SECRET_KEY }
22
27
  @volumes = { host_data_dir => DATA_DIR }
23
28
  @buckets = []
@@ -26,7 +31,12 @@ module Gitlab
26
31
  def instance
27
32
  raise 'Please provide a block!' unless block_given?
28
33
 
29
- super
34
+ prepare
35
+ start
36
+
37
+ yield self
38
+ ensure
39
+ teardown
30
40
  end
31
41
 
32
42
  def add_bucket(name)
@@ -60,12 +70,16 @@ module Gitlab
60
70
  @name ||= "minio-#{SecureRandom.hex(4)}"
61
71
  end
62
72
 
73
+ def hostname
74
+ "#{name}.#{network}"
75
+ end
76
+
63
77
  def port
64
78
  DEFAULT_PORT
65
79
  end
66
80
 
67
81
  def prepare
68
- super
82
+ @docker.pull(MINIO_IMAGE, MINIO_IMAGE_TAG)
69
83
 
70
84
  FileUtils.mkdir_p(host_data_dir)
71
85
 
@@ -73,12 +87,16 @@ module Gitlab
73
87
  puts "Creating Minio bucket: #{bucket}"
74
88
  FileUtils.mkdir_p(File.join(host_data_dir, bucket))
75
89
  end
90
+
91
+ return if @docker.network_exists?(network)
92
+
93
+ @docker.network_create(network)
76
94
  end
77
95
 
78
- def start # rubocop:disable Metrics/AbcSize
96
+ def start
79
97
  # --compat needed until https://gitlab.com/gitlab-org/gitlab-workhorse/issues/210
80
98
  # is resolved
81
- docker.run(image, tag, "server", "--compat", DATA_DIR) do |command|
99
+ docker.run(MINIO_IMAGE, MINIO_IMAGE_TAG, "server", "--compat", DATA_DIR) do |command|
82
100
  command << '-d '
83
101
  command << "--name #{name}"
84
102
  command << "--net #{network}"
@@ -97,6 +115,13 @@ module Gitlab
97
115
  end
98
116
  end
99
117
  end
118
+
119
+ def teardown
120
+ raise 'Invalid instance name!' unless name
121
+
122
+ @docker.stop(name)
123
+ @docker.remove(name)
124
+ end
100
125
  end
101
126
  end
102
127
  end
@@ -1,16 +1,43 @@
1
1
  module Gitlab
2
2
  module QA
3
3
  module Component
4
- class PostgreSQL < Base
5
- DOCKER_IMAGE = 'postgres'.freeze
6
- DOCKER_IMAGE_TAG = '11'.freeze
4
+ class PostgreSQL
5
+ include Scenario::Actable
6
+
7
+ POSTGRES_IMAGE = 'postgres'.freeze
8
+ POSTGRES_IMAGE_TAG = '11'.freeze
9
+
10
+ attr_reader :docker
11
+ attr_accessor :environment, :network
12
+ attr_writer :name
13
+
14
+ def initialize
15
+ @docker = Docker::Engine.new
16
+ @environment = {}
17
+ end
7
18
 
8
19
  def name
9
20
  @name ||= "postgres"
10
21
  end
11
22
 
23
+ def instance
24
+ prepare
25
+ start
26
+ wait_until_ready
27
+ yield self
28
+ ensure
29
+ teardown
30
+ end
31
+
32
+ def prepare
33
+ @docker.pull(POSTGRES_IMAGE, POSTGRES_IMAGE_TAG)
34
+ return if @docker.network_exists?(network)
35
+
36
+ @docker.network_create(network)
37
+ end
38
+
12
39
  def start
13
- @docker.run(image, tag) do |command|
40
+ @docker.run(POSTGRES_IMAGE, POSTGRES_IMAGE_TAG) do |command|
14
41
  command << "-d"
15
42
  command << "--name #{name}"
16
43
  command << "--net #{network}"
@@ -19,6 +46,11 @@ module Gitlab
19
46
  end
20
47
  end
21
48
 
49
+ def teardown
50
+ @docker.stop(name)
51
+ @docker.remove(name)
52
+ end
53
+
22
54
  def run_psql(command)
23
55
  @docker.exec(name, %(psql -U postgres #{command}))
24
56
  end
@@ -6,9 +6,22 @@ require 'securerandom'
6
6
  module Gitlab
7
7
  module QA
8
8
  module Component
9
- class SAML < Base
10
- DOCKER_IMAGE = 'jamedjo/test-saml-idp'.freeze
11
- DOCKER_IMAGE_TAG = 'latest'.freeze
9
+ class SAML
10
+ include Scenario::Actable
11
+
12
+ SAML_IMAGE = 'jamedjo/test-saml-idp'.freeze
13
+ SAML_IMAGE_TAG = 'latest'.freeze
14
+
15
+ attr_reader :docker
16
+ attr_accessor :volumes, :network, :environment
17
+ attr_writer :name
18
+
19
+ def initialize
20
+ @docker = Docker::Engine.new
21
+ @environment = {}
22
+ @volumes = {}
23
+ @network_aliases = []
24
+ end
12
25
 
13
26
  def set_entity_id(entity_id)
14
27
  @environment['SIMPLESAMLPHP_SP_ENTITY_ID'] = entity_id
@@ -18,10 +31,18 @@ module Gitlab
18
31
  @environment['SIMPLESAMLPHP_SP_ASSERTION_CONSUMER_SERVICE'] = assertion_con_service
19
32
  end
20
33
 
34
+ def add_network_alias(name)
35
+ @network_aliases.push(name)
36
+ end
37
+
21
38
  def name
22
39
  @name ||= "saml-qa-idp"
23
40
  end
24
41
 
42
+ def hostname
43
+ "#{name}.#{network}"
44
+ end
45
+
25
46
  def group_name
26
47
  @group_name ||= "saml_sso_group-#{SecureRandom.hex(4)}"
27
48
  end
@@ -29,12 +50,25 @@ module Gitlab
29
50
  def instance
30
51
  raise 'Please provide a block!' unless block_given?
31
52
 
32
- super
53
+ prepare
54
+ start
55
+
56
+ yield self
57
+ ensure
58
+ teardown
59
+ end
60
+
61
+ def prepare
62
+ pull
63
+
64
+ return if @docker.network_exists?(network)
65
+
66
+ @docker.network_create(network)
33
67
  end
34
68
 
35
69
  # rubocop:disable Metrics/AbcSize
36
70
  def start
37
- docker.run(image, tag) do |command|
71
+ docker.run(SAML_IMAGE, SAML_IMAGE_TAG) do |command|
38
72
  command << '-d '
39
73
  command << "--name #{name}"
40
74
  command << "--net #{network}"
@@ -57,6 +91,21 @@ module Gitlab
57
91
  end
58
92
  # rubocop:enable Metrics/AbcSize
59
93
 
94
+ def restart
95
+ @docker.restart(name)
96
+ end
97
+
98
+ def teardown
99
+ raise 'Invalid instance name!' unless name
100
+
101
+ @docker.stop(name)
102
+ @docker.remove(name)
103
+ end
104
+
105
+ def pull
106
+ @docker.pull(SAML_IMAGE, SAML_IMAGE_TAG)
107
+ end
108
+
60
109
  def set_sandbox_name(sandbox_name)
61
110
  ::Gitlab::QA::Runtime::Env.gitlab_sandbox_name = sandbox_name
62
111
  end
@@ -19,7 +19,16 @@ module Gitlab
19
19
  def perform # rubocop:disable Metrics/AbcSize
20
20
  raise ArgumentError unless [suite, release].all?
21
21
 
22
- @docker.login(**release.login_params) if release.login_params
22
+ if release.dev_gitlab_org?
23
+ Docker::Command.execute(
24
+ [
25
+ 'login',
26
+ '--username gitlab-qa-bot',
27
+ %(--password "#{Runtime::Env.dev_access_token_variable}"),
28
+ QA::Release::DEV_REGISTRY
29
+ ]
30
+ )
31
+ end
23
32
 
24
33
  puts "Running test suite `#{suite}` for #{release.project_name}"
25
34
 
@@ -8,10 +8,6 @@ module Gitlab
8
8
  URI(DOCKER_HOST).host
9
9
  end
10
10
 
11
- def login(username:, password:, registry:)
12
- Docker::Command.execute("login --username '#{username}' --password '#{password}' #{registry}")
13
- end
14
-
15
11
  def pull(image, tag)
16
12
  Docker::Command.execute("pull #{image}:#{tag}")
17
13
  end
@@ -67,10 +63,6 @@ module Gitlab
67
63
  def port(name, port)
68
64
  Docker::Command.execute("port #{name} #{port}/tcp")
69
65
  end
70
-
71
- def running?(name)
72
- Docker::Command.execute("ps -f name=#{name}").include?(name)
73
- end
74
66
  end
75
67
  end
76
68
  end
@@ -135,26 +135,6 @@ module Gitlab
135
135
  end
136
136
  end
137
137
 
138
- def login_params
139
- if dev_gitlab_org?
140
- Runtime::Env.require_qa_dev_access_token!
141
-
142
- {
143
- username: Runtime::Env.gitlab_dev_username,
144
- password: Runtime::Env.dev_access_token_variable,
145
- registry: DEV_REGISTRY
146
- }
147
- elsif omnibus_mirror?
148
- Runtime::Env.require_gitlab_bot_multi_project_pipeline_polling_token!
149
-
150
- {
151
- username: Runtime::Env.gitlab_username,
152
- password: Runtime::Env.gitlab_bot_multi_project_pipeline_polling_token,
153
- registry: COM_REGISTRY
154
- }
155
- end
156
- end
157
-
158
138
  def dev_gitlab_org?
159
139
  image.start_with?(DEV_REGISTRY)
160
140
  end
@@ -84,22 +84,10 @@ module Gitlab
84
84
  send(:attr_accessor, accessor) # rubocop:disable GitlabSecurity/PublicSend
85
85
  end
86
86
 
87
- def gitlab_username
88
- ENV['GITLAB_USERNAME'] || 'gitlab-qa'
89
- end
90
-
91
- def gitlab_dev_username
92
- ENV['GITLAB_DEV_USERNAME'] || 'gitlab-qa-bot'
93
- end
94
-
95
87
  def gitlab_api_base
96
88
  ENV['GITLAB_API_BASE'] || 'https://gitlab.com/api/v4'
97
89
  end
98
90
 
99
- def gitlab_bot_multi_project_pipeline_polling_token
100
- ENV['GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN']
101
- end
102
-
103
91
  def ci_job_name
104
92
  ENV['CI_JOB_NAME']
105
93
  end
@@ -207,14 +195,8 @@ module Gitlab
207
195
  end
208
196
  end
209
197
 
210
- def require_gitlab_bot_multi_project_pipeline_polling_token!
211
- return unless ENV['GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN'].to_s.strip.empty?
212
-
213
- raise ArgumentError, "Please provide GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN"
214
- end
215
-
216
198
  def skip_pull?
217
- enabled?(ENV['QA_SKIP_PULL'], default: false)
199
+ (ENV['QA_SKIP_PULL'] =~ /^(false|no|0)$/i) != 0
218
200
  end
219
201
 
220
202
  def gitlab_qa_formless_login_token
@@ -223,12 +205,6 @@ module Gitlab
223
205
 
224
206
  private
225
207
 
226
- def enabled?(value, default: true)
227
- return default if value.nil?
228
-
229
- (value =~ /^(false|no|0)$/i) != 0
230
- end
231
-
232
208
  def env_value_if_defined(variable)
233
209
  # Pass through the variables if they are defined in the environment
234
210
  return "$#{variable}" if ENV[variable]
@@ -31,7 +31,7 @@ module Gitlab
31
31
  praefect.release = QA::Release.new(release)
32
32
  praefect.name = @praefect_node
33
33
  praefect.network = @network
34
- praefect.skip_availability_check = true
34
+ praefect.skip_check = true
35
35
 
36
36
  praefect.omnibus_config = praefect_omnibus_configuration
37
37
 
@@ -149,7 +149,7 @@ module Gitlab
149
149
  gitaly.release = QA::Release.new(release)
150
150
  gitaly.name = name
151
151
  gitaly.network = @network
152
- gitaly.skip_availability_check = true
152
+ gitaly.skip_check = true
153
153
 
154
154
  gitaly.omnibus_config = gitaly_omnibus_configuration
155
155
 
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module QA
3
- VERSION = '5.13.5'.freeze
3
+ VERSION = '5.13.6'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-qa
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.13.5
4
+ version: 5.13.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Grzegorz Bizon
@@ -237,7 +237,6 @@ files:
237
237
  - fixtures/ldap/tanuki.ldif
238
238
  - gitlab-qa.gemspec
239
239
  - lib/gitlab/qa.rb
240
- - lib/gitlab/qa/component/base.rb
241
240
  - lib/gitlab/qa/component/elasticsearch.rb
242
241
  - lib/gitlab/qa/component/gitlab.rb
243
242
  - lib/gitlab/qa/component/internet_tunnel.rb
@@ -264,7 +263,6 @@ files:
264
263
  - lib/gitlab/qa/reporter.rb
265
264
  - lib/gitlab/qa/runner.rb
266
265
  - lib/gitlab/qa/runtime/env.rb
267
- - lib/gitlab/qa/runtime/scenario.rb
268
266
  - lib/gitlab/qa/runtime/token_finder.rb
269
267
  - lib/gitlab/qa/scenario/actable.rb
270
268
  - lib/gitlab/qa/scenario/cli_commands.rb
@@ -1,131 +0,0 @@
1
- module Gitlab
2
- module QA
3
- module Component
4
- class Base
5
- include Scenario::Actable
6
-
7
- attr_reader :docker
8
- attr_accessor :volumes, :network, :environment
9
- attr_writer :name, :exec_commands
10
-
11
- def initialize
12
- @docker = Docker::Engine.new
13
- @environment = {}
14
- @volumes = {}
15
- @network_aliases = []
16
-
17
- self.exec_commands = []
18
- end
19
-
20
- def add_network_alias(name)
21
- @network_aliases.push(name)
22
- end
23
-
24
- def name
25
- raise NotImplementedError, "#{self.class.name} must specify a default name"
26
- end
27
-
28
- def hostname
29
- "#{name}.#{network}"
30
- end
31
-
32
- def image
33
- return self.class.const_get('DOCKER_IMAGE') if self.class.const_defined?('DOCKER_IMAGE')
34
-
35
- raise NotImplementedError, "#{self.class.name} must specify a docker image as DOCKER_IMAGE"
36
- end
37
-
38
- def tag
39
- return self.class.const_get('DOCKER_IMAGE_TAG') if self.class.const_defined?('DOCKER_IMAGE_TAG')
40
-
41
- raise NotImplementedError, "#{self.class.name} must specify a docker image tag as DOCKER_IMAGE_TAG"
42
- end
43
-
44
- def instance
45
- prepare
46
- start
47
- reconfigure
48
- wait_until_ready
49
- process_exec_commands
50
-
51
- yield self if block_given?
52
- ensure
53
- teardown
54
- end
55
-
56
- alias_method :launch_and_teardown_instance, :instance
57
-
58
- def prepare
59
- prepare_docker_image
60
- prepare_network
61
- end
62
-
63
- def prepare_docker_image
64
- return if Runtime::Env.skip_pull?
65
-
66
- pull
67
- end
68
-
69
- def prepare_network
70
- return if docker.network_exists?(network)
71
-
72
- docker.network_create(network)
73
- end
74
-
75
- def start # rubocop:disable Metrics/AbcSize
76
- docker.run(image, tag) do |command|
77
- command << "-d"
78
- command << "--name #{name}"
79
- command << "--net #{network}"
80
- command << "--hostname #{hostname}"
81
-
82
- @volumes.to_h.each do |to, from|
83
- command.volume(to, from, 'Z')
84
- end
85
-
86
- command.volume(File.join(Runtime::Env.host_artifacts_dir, name, 'logs'), '/var/log/gitlab', 'Z')
87
-
88
- @environment.to_h.each do |key, value|
89
- command.env(key, value)
90
- end
91
-
92
- @network_aliases.to_a.each do |network_alias|
93
- command << "--network-alias #{network_alias}"
94
- end
95
- end
96
- end
97
-
98
- def restart
99
- assert_name!
100
-
101
- docker.restart(name)
102
- end
103
-
104
- def teardown
105
- assert_name!
106
-
107
- return unless docker.running?(name)
108
-
109
- docker.stop(name)
110
- docker.remove(name)
111
- end
112
-
113
- def pull
114
- docker.pull(image, tag)
115
- end
116
-
117
- def process_exec_commands
118
- exec_commands.each { |command| docker.exec(name, command) }
119
- end
120
-
121
- private
122
-
123
- attr_reader :exec_commands, :wait_until_ready, :reconfigure
124
-
125
- def assert_name!
126
- raise 'Invalid instance name!' unless name
127
- end
128
- end
129
- end
130
- end
131
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Gitlab
4
- module QA
5
- module Runtime
6
- ##
7
- # Singleton approach to global test scenario arguments.
8
- #
9
- module Scenario
10
- extend self
11
-
12
- def attributes
13
- @attributes ||= {}
14
- end
15
-
16
- def define(attribute, value)
17
- attributes.store(attribute.to_sym, value)
18
-
19
- define_singleton_method(attribute) do
20
- attributes[attribute.to_sym].tap do |value|
21
- if value.to_s.empty?
22
- raise ArgumentError, "Empty `#{attribute}` attribute!"
23
- end
24
- end
25
- end
26
- end
27
-
28
- # rubocop:disable Style/MethodMissing
29
- def method_missing(name, *)
30
- raise ArgumentError, "Scenario attribute `#{name}` not defined!"
31
- end
32
- # rubocop:enable Style/MethodMissing
33
- end
34
- end
35
- end
36
- end