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 +4 -4
- data/docs/what_tests_can_be_run.md +1 -1
- data/lib/gitlab/qa.rb +0 -2
- data/lib/gitlab/qa/component/elasticsearch.rb +32 -5
- data/lib/gitlab/qa/component/gitlab.rb +88 -15
- data/lib/gitlab/qa/component/internet_tunnel.rb +29 -6
- data/lib/gitlab/qa/component/jira.rb +44 -5
- data/lib/gitlab/qa/component/ldap.rb +51 -8
- data/lib/gitlab/qa/component/mail_hog.rb +44 -5
- data/lib/gitlab/qa/component/minio.rb +34 -9
- data/lib/gitlab/qa/component/postgresql.rb +36 -4
- data/lib/gitlab/qa/component/saml.rb +54 -5
- data/lib/gitlab/qa/component/specs.rb +10 -1
- data/lib/gitlab/qa/docker/engine.rb +0 -8
- data/lib/gitlab/qa/release.rb +0 -20
- data/lib/gitlab/qa/runtime/env.rb +1 -25
- data/lib/gitlab/qa/scenario/test/integration/gitaly_ha.rb +2 -2
- data/lib/gitlab/qa/version.rb +1 -1
- metadata +1 -3
- data/lib/gitlab/qa/component/base.rb +0 -131
- data/lib/gitlab/qa/runtime/scenario.rb +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 742350ecaafcf21ca9ff0fc50547cbb6cd28b2cf7a3fc090f5cb6ab542da3154
|
4
|
+
data.tar.gz: e65a23e2620961c5751eca131cf0dfa4b639f2915488b888975e6a0313c8baee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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` |
|
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|
|
data/lib/gitlab/qa.rb
CHANGED
@@ -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
|
5
|
-
|
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
|
12
|
-
|
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(
|
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
|
10
|
+
class Gitlab
|
11
11
|
extend Forwardable
|
12
|
+
include Scenario::Actable
|
12
13
|
|
13
|
-
attr_reader :release
|
14
|
-
attr_accessor :
|
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
|
-
|
24
|
-
|
24
|
+
@docker = Docker::Engine.new
|
25
|
+
@environment = {}
|
26
|
+
@volumes = {}
|
27
|
+
@network_aliases = []
|
25
28
|
@disable_animations = true
|
26
|
-
@
|
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
|
76
|
-
|
87
|
+
def instance
|
88
|
+
prepare
|
89
|
+
start
|
90
|
+
reconfigure
|
91
|
+
wait unless @skip_check
|
92
|
+
process_exec_commands
|
77
93
|
|
78
|
-
|
94
|
+
yield self if block_given?
|
95
|
+
ensure
|
96
|
+
teardown
|
79
97
|
end
|
80
98
|
|
81
|
-
|
82
|
-
docker.login(**release.login_params) if release.login_params
|
99
|
+
alias_method :launch_and_teardown_instance, :instance
|
83
100
|
|
84
|
-
|
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
|
131
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
5
|
-
|
6
|
-
|
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
|
-
|
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(
|
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
|
19
|
-
|
20
|
-
|
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
|
-
|
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
|
-
|
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(
|
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
|
-
|
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
|
8
|
-
|
9
|
-
|
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
|
-
|
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(
|
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
|
10
|
-
|
11
|
-
|
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
|
-
|
19
|
-
|
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
|
-
|
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
|
-
|
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
|
96
|
+
def start
|
79
97
|
# --compat needed until https://gitlab.com/gitlab-org/gitlab-workhorse/issues/210
|
80
98
|
# is resolved
|
81
|
-
docker.run(
|
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
|
5
|
-
|
6
|
-
|
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(
|
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
|
10
|
-
|
11
|
-
|
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
|
-
|
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(
|
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
|
-
|
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
|
data/lib/gitlab/qa/release.rb
CHANGED
@@ -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
|
-
|
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.
|
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.
|
152
|
+
gitaly.skip_check = true
|
153
153
|
|
154
154
|
gitaly.omnibus_config = gitaly_omnibus_configuration
|
155
155
|
|
data/lib/gitlab/qa/version.rb
CHANGED
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.
|
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
|