gitlab-qa 5.13.5 → 5.13.6

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: 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