gitlab-qa 5.12.0 → 5.13.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/docs/what_tests_can_be_run.md +55 -54
  3. data/lib/gitlab/qa.rb +4 -0
  4. data/lib/gitlab/qa/component/base.rb +131 -0
  5. data/lib/gitlab/qa/component/elasticsearch.rb +5 -33
  6. data/lib/gitlab/qa/component/gitlab.rb +16 -78
  7. data/lib/gitlab/qa/component/internet_tunnel.rb +6 -29
  8. data/lib/gitlab/qa/component/jira.rb +5 -44
  9. data/lib/gitlab/qa/component/ldap.rb +8 -51
  10. data/lib/gitlab/qa/component/mail_hog.rb +5 -44
  11. data/lib/gitlab/qa/component/minio.rb +9 -34
  12. data/lib/gitlab/qa/component/postgresql.rb +4 -36
  13. data/lib/gitlab/qa/component/release.rb +13 -0
  14. data/lib/gitlab/qa/component/saml.rb +5 -54
  15. data/lib/gitlab/qa/component/specs.rb +0 -11
  16. data/lib/gitlab/qa/component/staging.rb +2 -2
  17. data/lib/gitlab/qa/docker/engine.rb +8 -0
  18. data/lib/gitlab/qa/release.rb +25 -0
  19. data/lib/gitlab/qa/runtime/env.rb +29 -1
  20. data/lib/gitlab/qa/runtime/scenario.rb +36 -0
  21. data/lib/gitlab/qa/scenario/test/instance/any.rb +1 -1
  22. data/lib/gitlab/qa/scenario/test/instance/deployment_base.rb +1 -1
  23. data/lib/gitlab/qa/scenario/test/instance/geo.rb +1 -1
  24. data/lib/gitlab/qa/scenario/test/instance/release.rb +18 -0
  25. data/lib/gitlab/qa/scenario/test/instance/repository_storage.rb +1 -1
  26. data/lib/gitlab/qa/scenario/test/instance/smoke.rb +1 -1
  27. data/lib/gitlab/qa/scenario/test/integration/elasticsearch.rb +1 -1
  28. data/lib/gitlab/qa/scenario/test/integration/geo.rb +1 -1
  29. data/lib/gitlab/qa/scenario/test/integration/gitaly_ha.rb +5 -5
  30. data/lib/gitlab/qa/scenario/test/integration/jira.rb +1 -1
  31. data/lib/gitlab/qa/scenario/test/integration/packages.rb +1 -1
  32. data/lib/gitlab/qa/scenario/test/integration/praefect.rb +2 -2
  33. data/lib/gitlab/qa/scenario/test/integration/saml.rb +1 -1
  34. data/lib/gitlab/qa/scenario/test/integration/smtp.rb +1 -1
  35. data/lib/gitlab/qa/scenario/test/omnibus/update.rb +2 -2
  36. data/lib/gitlab/qa/scenario/test/omnibus/upgrade.rb +1 -1
  37. data/lib/gitlab/qa/scenario/test/sanity/version.rb +1 -1
  38. data/lib/gitlab/qa/version.rb +1 -1
  39. metadata +6 -2
@@ -0,0 +1,13 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ require 'uri'
4
+
5
+ module Gitlab
6
+ module QA
7
+ module Component
8
+ class Release < Staging
9
+ ADDRESS = 'https://release.gitlab.net'.freeze
10
+ end
11
+ end
12
+ end
13
+ end
@@ -6,22 +6,9 @@ require 'securerandom'
6
6
  module Gitlab
7
7
  module QA
8
8
  module Component
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
9
+ class SAML < Base
10
+ DOCKER_IMAGE = 'jamedjo/test-saml-idp'.freeze
11
+ DOCKER_IMAGE_TAG = 'latest'.freeze
25
12
 
26
13
  def set_entity_id(entity_id)
27
14
  @environment['SIMPLESAMLPHP_SP_ENTITY_ID'] = entity_id
@@ -31,18 +18,10 @@ module Gitlab
31
18
  @environment['SIMPLESAMLPHP_SP_ASSERTION_CONSUMER_SERVICE'] = assertion_con_service
32
19
  end
33
20
 
34
- def add_network_alias(name)
35
- @network_aliases.push(name)
36
- end
37
-
38
21
  def name
39
22
  @name ||= "saml-qa-idp"
40
23
  end
41
24
 
42
- def hostname
43
- "#{name}.#{network}"
44
- end
45
-
46
25
  def group_name
47
26
  @group_name ||= "saml_sso_group-#{SecureRandom.hex(4)}"
48
27
  end
@@ -50,25 +29,12 @@ module Gitlab
50
29
  def instance
51
30
  raise 'Please provide a block!' unless block_given?
52
31
 
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)
32
+ super
67
33
  end
68
34
 
69
35
  # rubocop:disable Metrics/AbcSize
70
36
  def start
71
- docker.run(SAML_IMAGE, SAML_IMAGE_TAG) do |command|
37
+ docker.run(image, tag) do |command|
72
38
  command << '-d '
73
39
  command << "--name #{name}"
74
40
  command << "--net #{network}"
@@ -91,21 +57,6 @@ module Gitlab
91
57
  end
92
58
  # rubocop:enable Metrics/AbcSize
93
59
 
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
-
109
60
  def set_sandbox_name(sandbox_name)
110
61
  ::Gitlab::QA::Runtime::Env.gitlab_sandbox_name = sandbox_name
111
62
  end
@@ -19,17 +19,6 @@ module Gitlab
19
19
  def perform # rubocop:disable Metrics/AbcSize
20
20
  raise ArgumentError unless [suite, release].all?
21
21
 
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
- Release::DEV_REGISTRY
29
- ]
30
- )
31
- end
32
-
33
22
  puts "Running test suite `#{suite}` for #{release.project_name}"
34
23
 
35
24
  name = "#{release.project_name}-qa-#{SecureRandom.hex(4)}"
@@ -10,7 +10,7 @@ module Gitlab
10
10
  GEO_SECONDARY_ADDRESS = 'https://geo.staging.gitlab.com'.freeze
11
11
 
12
12
  def self.release
13
- Release.new(image)
13
+ QA::Release.new(image)
14
14
  rescue Support::InvalidResponseError => ex
15
15
  warn ex.message
16
16
  warn "#{ex.response.code} #{ex.response.message}: #{ex.response.body}"
@@ -78,7 +78,7 @@ module Gitlab
78
78
  private
79
79
 
80
80
  def official?
81
- Release::DEV_OFFICIAL_TAG_REGEX.match?(version)
81
+ QA::Release::DEV_OFFICIAL_TAG_REGEX.match?(version)
82
82
  end
83
83
 
84
84
  def revision
@@ -8,6 +8,10 @@ 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
+
11
15
  def pull(image, tag)
12
16
  Docker::Command.execute("pull #{image}:#{tag}")
13
17
  end
@@ -63,6 +67,10 @@ module Gitlab
63
67
  def port(name, port)
64
68
  Docker::Command.execute("port #{name} #{port}/tcp")
65
69
  end
70
+
71
+ def running?(name)
72
+ Docker::Command.execute("ps -f name=#{name}").include?(name)
73
+ end
66
74
  end
67
75
  end
68
76
  end
@@ -52,6 +52,7 @@ module Gitlab
52
52
  DEFAULT_TAG = 'latest'.freeze
53
53
  DEFAULT_CANONICAL_TAG = 'nightly'.freeze
54
54
  DEV_REGISTRY = 'dev.gitlab.org:5005'.freeze
55
+ COM_REGISTRY = 'registry.gitlab.com'.freeze
55
56
 
56
57
  InvalidImageNameError = Class.new(RuntimeError)
57
58
 
@@ -134,10 +135,34 @@ module Gitlab
134
135
  end
135
136
  end
136
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
+
137
158
  def dev_gitlab_org?
138
159
  image.start_with?(DEV_REGISTRY)
139
160
  end
140
161
 
162
+ def omnibus_mirror?
163
+ image.start_with?("#{COM_REGISTRY}/gitlab-org/build/omnibus-gitlab-mirror/")
164
+ end
165
+
141
166
  def valid?
142
167
  canonical? || release.match?(CUSTOM_GITLAB_IMAGE_REGEX)
143
168
  end
@@ -84,10 +84,22 @@ 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
+
87
95
  def gitlab_api_base
88
96
  ENV['GITLAB_API_BASE'] || 'https://gitlab.com/api/v4'
89
97
  end
90
98
 
99
+ def gitlab_bot_multi_project_pipeline_polling_token
100
+ ENV['GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN']
101
+ end
102
+
91
103
  def ci_job_name
92
104
  ENV['CI_JOB_NAME']
93
105
  end
@@ -136,6 +148,10 @@ module Gitlab
136
148
  @host_artifacts_dir ||= File.join(ENV['QA_ARTIFACTS_DIR'] || '/tmp/gitlab-qa', Runtime::Env.run_id)
137
149
  end
138
150
 
151
+ def elastic_version
152
+ ENV['ELASTIC_VERSION'] || '6.4.2'.freeze
153
+ end
154
+
139
155
  def variables
140
156
  vars = {}
141
157
 
@@ -191,8 +207,14 @@ module Gitlab
191
207
  end
192
208
  end
193
209
 
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
+
194
216
  def skip_pull?
195
- (ENV['QA_SKIP_PULL'] =~ /^(false|no|0)$/i) != 0
217
+ enabled?(ENV['QA_SKIP_PULL'], default: false)
196
218
  end
197
219
 
198
220
  def gitlab_qa_formless_login_token
@@ -201,6 +223,12 @@ module Gitlab
201
223
 
202
224
  private
203
225
 
226
+ def enabled?(value, default: true)
227
+ return default if value.nil?
228
+
229
+ (value =~ /^(false|no|0)$/i) != 0
230
+ end
231
+
204
232
  def env_value_if_defined(variable)
205
233
  # Pass through the variables if they are defined in the environment
206
234
  return "$#{variable}" if ENV[variable]
@@ -0,0 +1,36 @@
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
@@ -11,7 +11,7 @@ module Gitlab
11
11
  def perform(edition_and_tag, address, *rspec_args)
12
12
  Component::Specs.perform do |specs|
13
13
  specs.suite = 'Test::Instance::All'
14
- specs.release = Release.new(edition_and_tag)
14
+ specs.release = QA::Release.new(edition_and_tag)
15
15
  specs.args = [address, *rspec_args]
16
16
  end
17
17
  end
@@ -18,7 +18,7 @@ module Gitlab
18
18
  release = if release_name.nil? || release_name.start_with?('--')
19
19
  deployment_component.release
20
20
  else
21
- Release.new(release_name)
21
+ QA::Release.new(release_name)
22
22
  end
23
23
 
24
24
  args.unshift(release_name) if release_name&.start_with?('--')
@@ -13,7 +13,7 @@ module Gitlab
13
13
 
14
14
  Component::Specs.perform do |specs|
15
15
  specs.suite = 'QA::EE::Scenario::Test::Geo'
16
- specs.release = Release.new(release)
16
+ specs.release = QA::Release.new(release)
17
17
  specs.args = [
18
18
  '--primary-address', primary_address,
19
19
  '--secondary-address', secondary_address,
@@ -0,0 +1,18 @@
1
+ module Gitlab
2
+ module QA
3
+ module Scenario
4
+ module Test
5
+ module Instance
6
+ ##
7
+ # Run test suite against release.gitlab.net
8
+ #
9
+ class Release < DeploymentBase
10
+ def deployment_component
11
+ Component::Release
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -6,7 +6,7 @@ module Gitlab
6
6
  class RepositoryStorage < Image
7
7
  def perform(release, *rspec_args)
8
8
  Component::Gitlab.perform do |gitlab|
9
- gitlab.release = Release.new(release)
9
+ gitlab.release = QA::Release.new(release)
10
10
  gitlab.name = 'gitlab'
11
11
  gitlab.network = 'test'
12
12
  gitlab.omnibus_config = <<~OMNIBUS
@@ -11,7 +11,7 @@ module Gitlab
11
11
  def perform(edition_and_tag, address, *rspec_args)
12
12
  Component::Specs.perform do |specs|
13
13
  specs.suite = 'Test::Instance::Smoke'
14
- specs.release = Release.new(edition_and_tag)
14
+ specs.release = QA::Release.new(edition_and_tag)
15
15
  specs.args = [address, *rspec_args]
16
16
  end
17
17
  end
@@ -16,7 +16,7 @@ module Gitlab
16
16
  end
17
17
 
18
18
  def perform(release, *rspec_args)
19
- release = Release.new(release)
19
+ release = QA::Release.new(release)
20
20
  before_perform(release)
21
21
 
22
22
  Component::Gitlab.perform do |gitlab|
@@ -10,7 +10,7 @@ module Gitlab
10
10
  # rubocop:disable Metrics/AbcSize
11
11
  #
12
12
  def perform(release, *rspec_args)
13
- release = Release.new(release)
13
+ release = QA::Release.new(release)
14
14
 
15
15
  raise ArgumentError, 'Geo is EE only!' unless release.ee?
16
16
 
@@ -28,16 +28,16 @@ module Gitlab
28
28
  sql.run_psql '-d template1 -c "CREATE DATABASE praefect_production OWNER postgres"'
29
29
 
30
30
  Component::Gitlab.perform do |praefect|
31
- praefect.release = Release.new(release)
31
+ praefect.release = QA::Release.new(release)
32
32
  praefect.name = @praefect_node
33
33
  praefect.network = @network
34
- praefect.skip_check = true
34
+ praefect.skip_availability_check = true
35
35
 
36
36
  praefect.omnibus_config = praefect_omnibus_configuration
37
37
 
38
38
  praefect.instance do
39
39
  Component::Gitlab.perform do |gitlab|
40
- gitlab.release = Release.new(release)
40
+ gitlab.release = QA::Release.new(release)
41
41
  gitlab.name = gitlab_name
42
42
  gitlab.network = @network
43
43
 
@@ -146,10 +146,10 @@ module Gitlab
146
146
 
147
147
  def gitaly(name, release)
148
148
  Component::Gitlab.perform do |gitaly|
149
- gitaly.release = Release.new(release)
149
+ gitaly.release = QA::Release.new(release)
150
150
  gitaly.name = name
151
151
  gitaly.network = @network
152
- gitaly.skip_check = true
152
+ gitaly.skip_availability_check = true
153
153
 
154
154
  gitaly.omnibus_config = gitaly_omnibus_configuration
155
155
 
@@ -6,7 +6,7 @@ module Gitlab
6
6
  class Jira < Scenario::Template
7
7
  def perform(release, *rspec_args)
8
8
  Component::Gitlab.perform do |gitlab|
9
- gitlab.release = Release.new(release)
9
+ gitlab.release = QA::Release.new(release)
10
10
  gitlab.network = 'test'
11
11
  gitlab.name = 'gitlab-jira'
12
12
 
@@ -6,7 +6,7 @@ module Gitlab
6
6
  class Packages < Scenario::Template
7
7
  def perform(release, *rspec_args)
8
8
  Component::Gitlab.perform do |gitlab|
9
- gitlab.release = Release.new(release)
9
+ gitlab.release = QA::Release.new(release)
10
10
  gitlab.name = 'gitlab-packages'
11
11
  gitlab.network = 'test'
12
12
  gitlab.omnibus_config = <<~OMNIBUS