gitlab-qa 8.14.0 → 8.15.0

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: 222f774a1b76d96311b8f50d198073376ec3a1c3728a85c181df3c7334635cc2
4
- data.tar.gz: 76038a8e5fb395209798fae12d58b29b297d4ea7b62b1227867b48547fa832e8
3
+ metadata.gz: 6f8235a7dbc3c61a6f538089128dc4a5ba7219c435a2fd107b9be7a7f8e79a23
4
+ data.tar.gz: 3ce7fbdcc46f5f7b7a25e87af2b681c8ef314c48afef9a7e0c139361dcfed7bc
5
5
  SHA512:
6
- metadata.gz: b52cf9e0f2e4ac6b7650c08cbbdc20428cf97dcb8ec4425c10d5b20c5b0b60c324336f6b39c82c01ff6ccb3a0ecc934204288dc76ceb1f677dfb7f55da73fca5
7
- data.tar.gz: e315e743dfd37f56cde0e7eff20ae757a7bb8f254cdea861871f22fffb36e58061bbe93a213036207efc685899ad04886374e7fd497ea4bf4b31251d1b1c0071
6
+ metadata.gz: a44d2a6d39df421e02e6dcb96b41aa32a53a65366f983e853376bde2c6b0e17ab1099ccd1b675c4c0b4b93e2bdd94bf661fff2e02edf8e68d43a7e2535ae756c
7
+ data.tar.gz: 919565630e715538ed4867339a27e553d90a80b3185b1caab4303aa65ef026a882f3fbb6446cbf5eb0e95944659da6adf6270ba2ecece62b85e60117248d9aee
@@ -5,9 +5,10 @@ ce:airgapped:
5
5
  - .high-capacity
6
6
  - .ce-variables
7
7
  - .rspec-report-opts
8
+ parallel: 10
8
9
  variables:
9
10
  QA_SCENARIO: "Test::Instance::Airgapped"
10
- QA_RSPEC_TAGS: "--tag smoke"
11
+ QA_RSPEC_TAGS: "--tag '~github' --tag '~skip_live_env'"
11
12
 
12
13
  ee:airgapped:
13
14
  extends:
@@ -16,8 +17,7 @@ ee:airgapped:
16
17
  - .high-capacity
17
18
  - .ee-variables
18
19
  - .rspec-report-opts
20
+ parallel: 10
19
21
  variables:
20
22
  QA_SCENARIO: "Test::Instance::Airgapped"
21
- QA_RSPEC_TAGS: "--tag smoke"
22
-
23
-
23
+ QA_RSPEC_TAGS: "--tag '~github' --tag '~skip_live_env'"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab-qa (8.14.0)
4
+ gitlab-qa (8.15.0)
5
5
  activesupport (~> 6.1)
6
6
  gitlab (~> 4.18.0)
7
7
  http (~> 5.0)
@@ -102,7 +102,7 @@ GEM
102
102
  rubocop-rails (~> 2.9)
103
103
  rubocop-rspec (~> 1.44)
104
104
  hashdiff (1.0.1)
105
- http (5.1.0)
105
+ http (5.1.1)
106
106
  addressable (~> 2.8)
107
107
  http-cookie (~> 1.0)
108
108
  http-form_data (~> 2.2)
@@ -120,6 +120,7 @@ GEM
120
120
  rexml
121
121
  kramdown-parser-gfm (1.1.0)
122
122
  kramdown (~> 2.0)
123
+ lefthook (1.2.6)
123
124
  llhttp-ffi (0.4.0)
124
125
  ffi-compiler (~> 1.0)
125
126
  rake (~> 13.0)
@@ -240,6 +241,7 @@ DEPENDENCIES
240
241
  gitlab-dangerfiles (~> 2.11)
241
242
  gitlab-qa!
242
243
  gitlab-styles (~> 6.2.1)
244
+ lefthook (~> 1.2.6)
243
245
  pry (~> 0.11)
244
246
  rake (~> 13.0)
245
247
  rspec (~> 3.7)
@@ -0,0 +1,28 @@
1
+ # HTTP mocking
2
+
3
+ Some scenario types might require mocking third party services. [Mock server](../../lib/gitlab/qa/component/mock_server.rb) component
4
+ can be used for that. It is based on simple http mock server called [smocker](https://smocker.dev/).
5
+
6
+ ## Using
7
+
8
+ Simple usage example:
9
+
10
+ ```ruby
11
+ Component::Gitlab.perform do |gitlab|
12
+ gitlab.network = 'test'
13
+ gitlab.instance do
14
+ Component::MockServer.perform do |mock|
15
+ mock.network = gitlab.network
16
+ mock.instance do
17
+ Component::Specs.perform do
18
+ ...
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ ```
25
+
26
+ Mock server will be accessible from within gitlab or qa test container via `http://smocker.test` url and admin interface will be
27
+ accessible via `http://smocker.test:8081`. Refer to [Getting Started](https://smocker.dev/guide/getting-started.html) guide on
28
+ how to use the server and define mocked requests and responses.
@@ -0,0 +1,32 @@
1
+ # SSL
2
+
3
+ ## Enabling https for services
4
+
5
+ In order to test services with ssl enabled, `certificate authority (CA)` certs as well as applicant key pairs have been created and are
6
+ located in [tls_certificates/](../../tls_certificates/) folder.
7
+
8
+ **All certificates are used for testing purposes only and are not present in any of release images.**
9
+
10
+ ## Generating new key pairs
11
+
12
+ To create new key pair for a new service, following commands can be used:
13
+
14
+ * creating new private key:
15
+
16
+ ```console
17
+ $ cd tls_certificates && mkdir service && cd service
18
+ ```
19
+
20
+ ```console
21
+ $ openssl genrsa -out service.key 4096
22
+ ```
23
+
24
+ * creating public key and `certificate signing request (CSR)`
25
+
26
+ ```console
27
+ $ openssl req -new -key service.key -out service.csr -subj "/C=US/ST=California/L=San Francisco/O=Gitlab Authors/CN=service.test" -addext "subjectAltName=DNS:service.test,DNS:extra.service.test"
28
+ ```
29
+
30
+ ```console
31
+ $ openssl x509 -req -days 3650 -in service.csr -CA ../authority/ca.crt -CAkey ../authority/ca.key -set_serial 1 -out service.crt -extfile <(printf "subjectAltName=DNS:service.test,DNS:extra.service.test")
32
+ ```
@@ -0,0 +1,29 @@
1
+ # Style Guide
2
+
3
+ ## RuboCop rule development guide
4
+
5
+ Our codebase style is defined and enforced by [RuboCop](https://github.com/rubocop/rubocop).
6
+
7
+ You can check for any offenses locally with `bundle exec rubocop --parallel`.
8
+ On the CI, this is automatically checked by the `rubocop` jobs in the `check` stage.
9
+
10
+ ### Lefthook
11
+
12
+ [Lefthook](https://github.com/evilmartians/lefthook) is a Git hooks manager that allows
13
+ custom logic to be executed prior to Git committing or pushing. GitLab comes with
14
+ Lefthook configuration (`lefthook.yml`), but it must be installed.
15
+
16
+ We have a `lefthook.yml` checked in but it is ignored until Lefthook is installed.
17
+
18
+ ### Install Lefthook
19
+
20
+ ```shell
21
+ # Install the `lefthook` Ruby gem:
22
+ bundle install
23
+ # Initialize the lefthook config and adds to .git/hooks dir
24
+ bundle exec lefthook install
25
+ # Verify hook execution works as expected
26
+ bundle exec lefthook run pre-push
27
+ ```
28
+
29
+ For a detailed guide on left hook configuration see https://github.com/evilmartians/lefthook/blob/master/docs/configuration.md
data/gitlab-qa.gemspec CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency 'climate_control', '~> 1.0.1'
24
24
  spec.add_development_dependency 'gitlab-dangerfiles', '~> 2.11'
25
25
  spec.add_development_dependency 'gitlab-styles', '~> 6.2.1'
26
+ spec.add_development_dependency 'lefthook', '~> 1.2.6'
26
27
  spec.add_development_dependency 'pry', '~> 0.11'
27
28
  spec.add_development_dependency 'rake', '~> 13.0'
28
29
  spec.add_development_dependency 'rspec', '~> 3.7'
data/lefthook.yml ADDED
@@ -0,0 +1,12 @@
1
+ # EXAMPLE USAGE:
2
+
3
+ # Refer for explanation to following link:
4
+ # https://github.com/evilmartians/lefthook/blob/master/docs/configuration.md
5
+ #
6
+ pre-push:
7
+ commands:
8
+ rubocop:
9
+ tags: backend style
10
+ files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
11
+ glob: '*.{rb,rake}'
12
+ run: REVEAL_RUBOCOP_TODO=0 bundle exec rubocop --parallel --force-exclusion {files}
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+
5
+ module Gitlab
6
+ module QA
7
+ module Component
8
+ # Generic helper component running alpine linux image
9
+ # Useful for populating volumes beforehand or running any other action that requires a running container
10
+ # and has to be performed before main component containers are started
11
+ #
12
+ class Alpine < Base
13
+ DOCKER_IMAGE = "alpine"
14
+ DOCKER_IMAGE_TAG = "latest"
15
+
16
+ def name
17
+ @name ||= "alpine-#{SecureRandom.hex(4)}"
18
+ end
19
+
20
+ def start
21
+ docker.run(image: image, tag: tag, args: ["tail", "-f", "/dev/null"]) do |command|
22
+ command << "-d"
23
+ command << "--name #{name}"
24
+
25
+ volumes.each { |to, from| command.volume(to, from, 'Z') }
26
+ environment.each { |key, value| command.env(key, value) }
27
+ end
28
+ end
29
+
30
+ def prepare
31
+ prepare_docker_container
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -6,9 +6,18 @@ module Gitlab
6
6
  class Base
7
7
  include Scenario::Actable
8
8
 
9
+ CERTIFICATES_PATH = File.expand_path('../../../../tls_certificates', __dir__)
10
+
9
11
  attr_reader :docker
10
- attr_accessor :volumes, :ports, :network, :environment, :runner_network, :airgapped_network
11
12
  attr_writer :name, :exec_commands
13
+ attr_accessor :volumes,
14
+ :ports,
15
+ :network,
16
+ :network_aliases,
17
+ :environment,
18
+ :runner_network,
19
+ :airgapped_network,
20
+ :additional_hosts
12
21
 
13
22
  def initialize
14
23
  @docker = Docker::Engine.new
@@ -17,6 +26,7 @@ module Gitlab
17
26
  @ports = []
18
27
  @network_aliases = []
19
28
  @exec_commands = []
29
+ @additional_hosts = []
20
30
  end
21
31
 
22
32
  def add_network_alias(name)
@@ -74,18 +84,21 @@ module Gitlab
74
84
  def prepare_network
75
85
  prepare_airgapped_network
76
86
  prepare_runner_network
77
-
78
87
  return if docker.network_exists?(network)
79
88
 
80
89
  docker.network_create(network)
81
90
  end
82
91
 
83
92
  def prepare_airgapped_network
84
- docker.network_create("--driver=bridge --internal #{network}") if airgapped_network && !docker.network_exists?(network)
93
+ return unless airgapped_network && !docker.network_exists?(network)
94
+
95
+ docker.network_create("--driver=bridge --internal #{network}")
85
96
  end
86
97
 
87
98
  def prepare_runner_network
88
- docker.network_create("--driver=bridge --internal #{runner_network}") if runner_network && !docker.network_exists?(runner_network)
99
+ return unless runner_network && !docker.network_exists?(runner_network)
100
+
101
+ docker.network_create("--driver=bridge --internal #{runner_network}")
89
102
  end
90
103
 
91
104
  def prepare_docker_container
@@ -118,6 +131,10 @@ module Gitlab
118
131
  @network_aliases.to_a.each do |network_alias|
119
132
  command << "--network-alias #{network_alias}"
120
133
  end
134
+
135
+ @additional_hosts.each do |host|
136
+ command << "--add-host=#{host}"
137
+ end
121
138
  end
122
139
  end
123
140
 
@@ -6,7 +6,7 @@ module Gitlab
6
6
  class GitalyCluster
7
7
  class GitalyClusterConfig
8
8
  attr_accessor :gitlab_name, :network, :airgapped_network,
9
- :praefect_node_name, :praefect_port,
9
+ :praefect_node_name, :praefect_port, :praefect_ip,
10
10
  :primary_node_name, :primary_node_port,
11
11
  :secondary_node_name, :secondary_node_port,
12
12
  :tertiary_node_name, :tertiary_node_port,
@@ -90,6 +90,7 @@ module Gitlab
90
90
  end
91
91
 
92
92
  @praefect_node = praefect(release)
93
+ config.praefect_ip = praefect_node.ip_address
93
94
  Runtime::Logger.info("Gitaly Cluster Ready")
94
95
  end
95
96
 
@@ -16,17 +16,28 @@ module Gitlab
16
16
  extend Forwardable
17
17
  using Rainbow
18
18
 
19
- attr_reader :release, :omnibus_configuration, :omnibus_gitlab_rails_env
20
- attr_accessor :tls, :skip_availability_check, :runner_network, :seed_admin_token, :seed_db, :skip_server_hooks
19
+ attr_reader :release,
20
+ :omnibus_configuration,
21
+ :omnibus_gitlab_rails_env,
22
+ :authority_volume,
23
+ :ssl_volume
24
+
25
+ attr_accessor :tls,
26
+ :skip_availability_check,
27
+ :runner_network,
28
+ :seed_admin_token,
29
+ :seed_db,
30
+ :skip_server_hooks,
31
+ :gitaly_tls
32
+
21
33
  attr_writer :name, :relative_path
22
34
 
23
35
  def_delegators :release, :tag, :image, :edition
24
36
 
25
- CERTIFICATES_PATH = File.expand_path('../../../../tls_certificates', __dir__)
26
37
  DATA_SEED_PATH = File.expand_path('../../../../support/data', __dir__)
27
38
 
28
- SSL_PATH = '/etc/gitlab/ssl'
29
39
  TRUSTED_PATH = '/etc/gitlab/trusted-certs'
40
+ SSL_PATH = '/etc/gitlab/ssl'
30
41
  DATA_PATH = '/tmp/data-seeds'
31
42
 
32
43
  def initialize
@@ -34,17 +45,8 @@ module Gitlab
34
45
 
35
46
  @skip_availability_check = false
36
47
  @omnibus_gitlab_rails_env = {}
37
-
38
48
  @omnibus_configuration = Runtime::OmnibusConfiguration.new(Runtime::Scenario.omnibus_configuration)
39
-
40
- @working_dir_tmp_cert_path = Dir.mktmpdir('certs', FileUtils.mkdir_p("#{Dir.pwd}/tmp"))
41
- @authority_cert_path = "#{@working_dir_tmp_cert_path}/authority"
42
- @gitlab_cert_path = "#{@working_dir_tmp_cert_path}/gitlab"
43
- @gitaly_cert_path = "#{@working_dir_tmp_cert_path}/gitaly"
44
-
45
- @volumes[@gitlab_cert_path] = SSL_PATH
46
- @volumes[@authority_cert_path] = TRUSTED_PATH
47
-
49
+ @cert_volumes = { "authority" => TRUSTED_PATH, "gitlab-ssl" => SSL_PATH }
48
50
  @seed_admin_token = Runtime::Scenario.seed_admin_token
49
51
  @seed_db = Runtime::Scenario.seed_db
50
52
  @skip_server_hooks = Runtime::Scenario.skip_server_hooks
@@ -89,11 +91,6 @@ module Gitlab
89
91
  tls ? ["443:443"] : ["80"]
90
92
  end
91
93
 
92
- def gitaly_tls
93
- @volumes.delete(@gitlab_cert_path)
94
- @volumes[@gitaly_cert_path] = SSL_PATH
95
- end
96
-
97
94
  def relative_path
98
95
  @relative_path ||= ''
99
96
  end
@@ -109,12 +106,6 @@ module Gitlab
109
106
  super
110
107
  end
111
108
 
112
- def teardown!
113
- FileUtils.rm_rf(@working_dir_tmp_cert_path)
114
-
115
- super
116
- end
117
-
118
109
  def pull
119
110
  docker.login(**release.login_params) if release.login_params
120
111
 
@@ -146,7 +137,7 @@ module Gitlab
146
137
  command.port(mapping)
147
138
  end
148
139
 
149
- @volumes.to_h.each do |to, from|
140
+ @volumes.to_h.merge(cert_volumes).each do |to, from|
150
141
  command.volume(to, from, 'Z')
151
142
  end
152
143
 
@@ -159,6 +150,10 @@ module Gitlab
159
150
  @network_aliases.to_a.each do |network_alias|
160
151
  command << "--network-alias #{network_alias}"
161
152
  end
153
+
154
+ @additional_hosts.each do |host|
155
+ command << "--add-host=#{host}"
156
+ end
162
157
  end
163
158
 
164
159
  return unless runner_network
@@ -239,19 +234,28 @@ module Gitlab
239
234
 
240
235
  private
241
236
 
237
+ attr_reader :cert_volumes
238
+
242
239
  def read_package_manifest
243
- @docker.read_file(
244
- @release.image, @release.tag,
245
- '/opt/gitlab/version-manifest.json'
246
- )
240
+ @docker.read_file(@release.image, @release.tag, '/opt/gitlab/version-manifest.json')
247
241
  end
248
242
 
249
- # Copy certs to a temporary directory in current working directory.
250
- # This is needed for docker-in-docker ci environments where mount points outside of build dir are not accessible
243
+ # Create cert files in separate volumes
244
+ #
245
+ # tls_certificates folder can't be mounted directly when remote docker context is used
246
+ # due to not having access to local dir
251
247
  #
252
248
  # @return [void]
253
249
  def copy_certificates
254
- FileUtils.cp_r("#{CERTIFICATES_PATH}/.", @working_dir_tmp_cert_path)
250
+ Alpine.perform do |alpine|
251
+ alpine.volumes = cert_volumes
252
+
253
+ alpine.start_instance
254
+ docker.copy(alpine.name, "#{CERTIFICATES_PATH}/authority/.", TRUSTED_PATH)
255
+ docker.copy(alpine.name, "#{CERTIFICATES_PATH}/#{gitaly_tls ? 'gitaly' : 'gitlab'}/.", SSL_PATH)
256
+ ensure
257
+ alpine.teardown! # always remove container, even when global `--no-tests` flag was provided
258
+ end
255
259
  end
256
260
 
257
261
  def ensure_configured!
@@ -3,6 +3,9 @@
3
3
  module Gitlab
4
4
  module QA
5
5
  module Component
6
+ # General purpose http mock server
7
+ # see: https://smocker.dev/
8
+ #
6
9
  class MockServer < Base
7
10
  DOCKER_IMAGE = "thiht/smocker"
8
11
  DOCKER_IMAGE_TAG = "0.18.2"
@@ -10,11 +13,45 @@ module Gitlab
10
13
  def initialize
11
14
  super
12
15
 
13
- @ports = %w[8080 8081]
14
- @name = "smocker-server"
16
+ @tls = false
17
+ @name = "smocker"
18
+ @tls_path = "/etc/smocker/tls"
19
+ @ports = [80, 8081]
20
+ @environment = { "SMOCKER_MOCK_SERVER_LISTEN_PORT" => 80 }
15
21
  end
16
22
 
17
23
  attr_reader :name
24
+ attr_writer :tls
25
+
26
+ def prepare
27
+ super
28
+
29
+ setup_tls if tls
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :tls_path, :tls
35
+
36
+ def setup_tls
37
+ @volumes = { "smocker-ssl" => tls_path }
38
+ @ports = [443, 8081]
39
+ @environment = {
40
+ "SMOCKER_MOCK_SERVER_LISTEN_PORT" => 443,
41
+ "SMOCKER_TLS_ENABLE" => "true",
42
+ "SMOCKER_TLS_CERT_FILE" => "#{@tls_path}/smocker.crt",
43
+ "SMOCKER_TLS_PRIVATE_KEY_FILE" => "#{@tls_path}/smocker.key"
44
+ }
45
+
46
+ Alpine.perform do |alpine|
47
+ alpine.volumes = volumes
48
+
49
+ alpine.start_instance
50
+ docker.copy(alpine.name, "#{CERTIFICATES_PATH}/smocker/.", tls_path)
51
+ ensure
52
+ alpine.teardown! # always remove container, even when global `--no-tests` flag was provided
53
+ end
54
+ end
18
55
  end
19
56
  end
20
57
  end
@@ -39,7 +39,6 @@ module Gitlab
39
39
  'QA_EXPORT_TEST_METRICS' => :qa_export_test_metrics,
40
40
  'QA_INFLUXDB_URL' => :qa_influxdb_url,
41
41
  'QA_INFLUXDB_TOKEN' => :qa_influxdb_token,
42
- 'QA_RUN_TYPE' => :qa_run_type,
43
42
  'QA_SKIP_PULL' => :qa_skip_pull,
44
43
  'QA_VALIDATE_RESOURCE_REUSE' => :qa_validate_resource_reuse,
45
44
  'GITLAB_API_BASE' => :api_base,
@@ -7,31 +7,38 @@ module Gitlab
7
7
  module Instance
8
8
  class Airgapped < Scenario::Template
9
9
  require 'resolv'
10
- attr_reader :config, :gitlab_air_gap_commands
10
+ attr_reader :config, :gitlab_air_gap_commands, :iptables_restricted_network, :airgapped_network_name
11
11
 
12
12
  def initialize
13
+ # Uses https://docs.docker.com/engine/reference/commandline/network_create/#network-internal-mode
14
+ @airgapped_network_name = 'airgapped'
15
+ # Uses iptables to deny all network traffic, with a number of exceptions for required ports and IPs
16
+ @iptables_restricted_network = 'test'
13
17
  @config = Component::GitalyCluster::GitalyClusterConfig.new(
18
+ gitlab_name: "gitlab-airgapped-#{SecureRandom.hex(4)}",
14
19
  airgapped_network: true,
15
- network: 'airgapped'
20
+ network: airgapped_network_name
16
21
  )
17
22
  end
18
23
 
19
24
  def perform(release, *rspec_args)
20
25
  Component::Gitlab.perform do |gitlab|
21
- cluster = Component::GitalyCluster.perform do |cluster|
26
+ Component::GitalyCluster.perform do |cluster|
22
27
  cluster.config = @config
23
- cluster.instance
28
+ cluster.release = release
29
+ # we need to get an IP for praefect before proceeding so it cannot be run in parallel with gitlab
30
+ cluster.instance(true).join
24
31
  end
25
32
  gitlab.name = config.gitlab_name
26
33
  gitlab.release = release
27
- gitlab.airgapped_network = true
28
- gitlab.network = config.network
34
+ gitlab.network = iptables_restricted_network # we use iptables to restrict access on the gitlab instance
35
+ gitlab.runner_network = config.network
36
+ gitlab.exec_commands = airgap_gitlab_commands
37
+ gitlab.skip_availability_check = true
29
38
  gitlab.omnibus_configuration << gitlab_omnibus_configuration
30
- gitlab.skip_availability_check = true # airgapped environment cannot be pinged to check health
31
39
  rspec_args << "--" unless rspec_args.include?('--')
32
40
  rspec_args << %w[--tag ~orchestrated]
33
41
  gitlab.instance do
34
- cluster.join
35
42
  Component::Specs.perform do |specs|
36
43
  specs.suite = 'Test::Instance::Airgapped'
37
44
  specs.release = gitlab.release
@@ -45,9 +52,55 @@ module Gitlab
45
52
 
46
53
  private
47
54
 
55
+ def airgap_gitlab_commands
56
+ gitlab_ip = Resolv.getaddress('gitlab.com')
57
+ gitlab_registry_ip = Resolv.getaddress(QA::Release::COM_REGISTRY)
58
+ dev_gitlab_registry_ip = Resolv.getaddress(QA::Release::DEV_REGISTRY.split(':')[0])
59
+ praefect_ip = config.praefect_ip
60
+ @commands = <<~AIRGAP_AND_VERIFY_COMMAND.split(/\n+/)
61
+ # Should not fail before airgapping due to eg. DNS failure
62
+ # Ping and wget check
63
+ apt-get update && apt-get install -y iptables ncat
64
+ if ncat -zv -w 10 #{gitlab_ip} 80; then echo 'Airgapped connectivity check passed.'; else echo 'Airgapped connectivity check failed - should be able to access gitlab_ip'; exit 1; fi;
65
+
66
+ echo "Checking regular connectivity..." \
67
+ && wget --retry-connrefused --waitretry=1 --read-timeout=15 --timeout=10 -t 2 http://registry.gitlab.com > /dev/null 2>&1 \
68
+ && (echo "Regular connectivity wget check passed." && exit 0) || (echo "Regular connectivity wget check failed." && exit 1)
69
+
70
+ iptables -P INPUT DROP && iptables -P OUTPUT DROP
71
+ iptables -A INPUT -i lo -j ACCEPT && iptables -A OUTPUT -o lo -j ACCEPT # LOOPBACK
72
+ iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
73
+ iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
74
+
75
+ # Jenkins on port 8080 and 50000
76
+ iptables -A OUTPUT -p tcp -m tcp --dport 8080 -m state --state NEW,ESTABLISHED -j ACCEPT \
77
+ && iptables -A OUTPUT -p tcp -m tcp --dport 50000 -m state --state NEW,ESTABLISHED -j ACCEPT
78
+ iptables -A OUTPUT -p tcp -m tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
79
+ iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
80
+ iptables -A OUTPUT -p tcp -m tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
81
+ iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
82
+
83
+ # some exceptions to allow runners access network https://gitlab.com/gitlab-org/gitlab-qa/-/issues/700
84
+ iptables -A OUTPUT -p tcp -d #{gitlab_registry_ip} -j ACCEPT
85
+ iptables -A OUTPUT -p tcp -d #{dev_gitlab_registry_ip} -j ACCEPT
86
+ # allow access to praefect node
87
+ iptables -A OUTPUT -p tcp -d #{praefect_ip} -j ACCEPT
88
+
89
+ # Should now fail to ping gitlab_ip, port 22/80 should be open
90
+ if ncat -zv -w 10 #{gitlab_ip} 80; then echo 'Airgapped connectivity check failed - should not be able to access gitlab_ip'; exit 1; else echo 'Airgapped connectivity check passed.'; fi;
91
+ if ncat -zv -w 10 127.0.0.1 22; then echo 'Airgapped connectivity port 22 check passed.'; else echo 'Airgapped connectivity port 22 check failed.'; exit 1; fi;
92
+ if ncat -zv -w 10 127.0.0.1 80; then echo 'Airgapped connectivity port 80 check passed.'; else echo 'Airgapped connectivity port 80 check failed.'; exit 1 ; fi;
93
+ if ncat -zv -w 10 #{gitlab_registry_ip} 80; then echo 'Airgapped connectivity port gitlab_registry_ip check passed.'; else echo 'Airgapped connectivity port 80 check failed.'; exit 1; fi;
94
+
95
+ echo "Checking airgapped connectivity..." \
96
+ && wget --retry-connrefused --waitretry=1 --read-timeout=15 --timeout=10 -t 2 http://registry.gitlab.com > /dev/null 2>&1 \
97
+ && (echo "Airgapped network faulty. Connectivity wget check failed." && exit 1) || (echo "Airgapped network confirmed. Connectivity wget check passed." && exit 0)
98
+ AIRGAP_AND_VERIFY_COMMAND
99
+ end
100
+
48
101
  def gitlab_omnibus_configuration
49
102
  <<~OMNIBUS
50
- external_url 'http://#{config.gitlab_name}.#{config.network}';
103
+ external_url 'http://#{config.gitlab_name}.#{iptables_restricted_network}';
51
104
 
52
105
  git_data_dirs({
53
106
  'default' => {
@@ -21,7 +21,10 @@ module Gitlab
21
21
  gitlab.name = config.gitlab_name
22
22
  gitlab.network = config.network
23
23
  gitlab.omnibus_configuration << gitlab_omnibus_configuration
24
- cluster = Component::GitalyCluster.perform(&:instance)
24
+ cluster = Component::GitalyCluster.perform do |cluster|
25
+ cluster.release = release
26
+ cluster.instance
27
+ end
25
28
  gitlab.instance do
26
29
  cluster.join
27
30
  Runtime::Logger.info('Running Gitaly Cluster specs!')
@@ -14,10 +14,13 @@ module Gitlab
14
14
  #
15
15
  class Import < Scenario::Template
16
16
  def initialize
17
- @source_gitlab = Component::Gitlab.new
18
- @target_gitlab = Component::Gitlab.new
19
- @mock_server = Component::MockServer.new
20
17
  @network = "test"
18
+ @source_gitlab = Component::Gitlab.new.tap { |gitlab| gitlab.network = @network }
19
+ @target_gitlab = Component::Gitlab.new.tap { |gitlab| gitlab.network = @network }
20
+ @mock_server = Component::MockServer.new.tap do |server|
21
+ server.network = @network
22
+ server.tls = true
23
+ end
21
24
  end
22
25
 
23
26
  attr_reader :source_gitlab, :target_gitlab, :mock_server, :network
@@ -39,11 +42,7 @@ module Gitlab
39
42
  #
40
43
  # @return [void]
41
44
  def start_mock_server
42
- mock_server.tap do |server|
43
- server.network = network
44
-
45
- server.start_instance
46
- end
45
+ mock_server.start_instance
47
46
  end
48
47
 
49
48
  # Start gitlab instance
@@ -52,14 +51,19 @@ module Gitlab
52
51
  # @return [void]
53
52
  def start_gitlab_instances(release)
54
53
  instances = [
55
- { instance: source_gitlab, name: "import-source" },
56
- { instance: target_gitlab, name: "import-target" }
54
+ { instance: source_gitlab, name: "import-source", additional_hosts: [] },
55
+ {
56
+ instance: target_gitlab,
57
+ name: "import-target",
58
+ additional_hosts: ["api.github.com:#{mock_server.ip_address}"]
59
+ }
57
60
  ]
61
+
58
62
  ::Parallel.each(instances, in_threads: 2) do |gitlab_instance|
59
63
  gitlab_instance[:instance].tap do |gitlab|
60
64
  gitlab.name = gitlab_instance[:name]
61
- gitlab.network = network
62
65
  gitlab.release = release
66
+ gitlab.additional_hosts = gitlab_instance[:additional_hosts]
63
67
  gitlab.seed_admin_token = true
64
68
 
65
69
  gitlab.start_instance
@@ -76,8 +80,12 @@ module Gitlab
76
80
  specs.suite = "Test::Integration::Import"
77
81
  specs.release = target_gitlab.release
78
82
  specs.network = network
79
- specs.env = { "QA_IMPORT_SOURCE_URL" => source_gitlab.address, "QA_ALLOW_LOCAL_REQUESTS" => "true" }
80
83
  specs.args = [target_gitlab.address, *rspec_args]
84
+ specs.env = {
85
+ "QA_ALLOW_LOCAL_REQUESTS" => "true",
86
+ "QA_IMPORT_SOURCE_URL" => source_gitlab.address,
87
+ "QA_SMOCKER_HOST" => mock_server.hostname
88
+ }
81
89
  end
82
90
  end
83
91
  end
@@ -16,44 +16,57 @@ module Gitlab
16
16
  end
17
17
 
18
18
  def perform(release, *rspec_args)
19
- Component::Gitlab.perform do |gitaly|
20
- gitaly.release = QA::Release.new(release)
21
- gitaly.name = @gitaly_name
22
- gitaly.network = @network
23
- gitaly.skip_availability_check = true
24
- gitaly.seed_admin_token = false
25
-
26
- gitaly.omnibus_configuration << gitaly_omnibus
27
- gitaly.gitaly_tls
28
-
29
- gitaly.instance do
30
- Component::Gitlab.perform do |gitlab|
31
- gitlab.release = QA::Release.new(release)
32
- gitlab.name = @gitlab_name
33
- gitlab.network = @network
34
-
35
- gitlab.omnibus_configuration << gitlab_omnibus
36
- gitlab.tls = true
37
-
38
- gitlab.instance do
39
- Runtime::Logger.info("Running mTLS specs!")
40
-
41
- if @tag
42
- rspec_args << "--" unless rspec_args.include?('--')
43
- rspec_args << "--tag" << @tag
44
- end
45
-
46
- Component::Specs.perform do |specs|
47
- specs.suite = @spec_suite
48
- specs.release = gitlab.release
49
- specs.network = gitlab.network
50
- specs.args = [gitlab.address, *rspec_args]
51
- specs.env = @env
52
- end
53
- end
19
+ # You can create 2 networks with the same 'human friendly' name if you run network create in parallel
20
+ # However this causes 'ambiguous network' errors, so lets just create network manually earlier
21
+ # see https://github.com/moby/moby/issues/18864#issuecomment-167006094
22
+ # and also api docs https://github.com/moby/moby/blob/master/docs/api/v1.42.yaml#L9932-L9941
23
+ docker = Docker::Engine.new
24
+ docker.network_create(@network) unless docker.network_exists?(@network)
25
+
26
+ gitaly_thread = Thread.new do
27
+ Thread.current.abort_on_exception = true
28
+ @gitaly_node = Component::Gitlab.perform do |gitaly|
29
+ gitaly.release = QA::Release.new(release)
30
+ gitaly.name = @gitaly_name
31
+ gitaly.network = @network
32
+ gitaly.skip_availability_check = true
33
+ gitaly.seed_admin_token = false
34
+
35
+ gitaly.omnibus_configuration << gitaly_omnibus
36
+ gitaly.gitaly_tls = true
37
+
38
+ gitaly.instance(skip_teardown: true)
39
+ end
40
+ end
41
+
42
+ Component::Gitlab.perform do |gitlab|
43
+ gitlab.release = QA::Release.new(release)
44
+ gitlab.name = @gitlab_name
45
+ gitlab.network = @network
46
+
47
+ gitlab.omnibus_configuration << gitlab_omnibus
48
+ gitlab.tls = true
49
+
50
+ gitlab.instance do
51
+ gitaly_thread.join
52
+ Runtime::Logger.info("Running mTLS specs!")
53
+
54
+ if @tag
55
+ rspec_args << "--" unless rspec_args.include?('--')
56
+ rspec_args << "--tag" << @tag
57
+ end
58
+
59
+ Component::Specs.perform do |specs|
60
+ specs.suite = @spec_suite
61
+ specs.release = gitlab.release
62
+ specs.network = gitlab.network
63
+ specs.args = [gitlab.address, *rspec_args]
64
+ specs.env = @env
54
65
  end
55
66
  end
56
67
  end
68
+ ensure
69
+ @gitaly_node&.teardown
57
70
  end
58
71
 
59
72
  def gitlab_omnibus
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Gitlab
4
4
  module QA
5
- VERSION = '8.14.0'
5
+ VERSION = '8.15.0'
6
6
  end
7
7
  end
@@ -0,0 +1,31 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFZzCCA0+gAwIBAgIBATANBgkqhkiG9w0BAQsFADBVMQswCQYDVQQGEwJVUzET
3
+ MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEZMBcG
4
+ A1UECgwQR2l0TGFiIEF1dGhvcml0eTAeFw0yMzAxMDIxMDEyNDRaFw0zMjEyMzAx
5
+ MDEyNDRaMGwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYD
6
+ VQQHDA1TYW4gRnJhbmNpc2NvMRcwFQYDVQQKDA5HaXRsYWIgQXV0aG9yczEXMBUG
7
+ A1UEAwwOYXBpLmdpdGh1Yi5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
8
+ AoICAQC8cKxIATD8EaMSUoKMNhLTsQ/iawXBXR+r0BKWjzF6TxdYYlyU/tnH5TJA
9
+ 43uUIJDrO1l5vdFMrZ9XemzN8qF/lUpTc3fnFQNE998NzZzdG3Do3hOTayTRYlje
10
+ 7PxB3Y8ekpbCqW5lJkR9fC/T8CTAog0wK8wIn0wCgBwiuM1IPzMutYGUZgxAnw2h
11
+ zIHCF68mfZhqiKG3ZcKSwQct2FL5/9ZcC71AkxopK0YBOLn7rReEhC8PwOIWdxD4
12
+ EyB3Hd4sxzT9ZOOSwyXO/FAQFBioHmeI6CxS4BOOBK8KDGGZ1gvIQq2OHYNxqzXB
13
+ iJ5zYEMqXr9dV0zKZ0+0EuNZEEO7TwW2WnbiFDlBzGIXjBVSPc26pQjFnC5YniPb
14
+ cKC+J7pkZtbiWlo59WFvtLe/FRTiN+64pNXKiMeGBbKduYOANcNj1IO7Vi6o5ln8
15
+ s4tilAe4TJNiIMyKBGoP7X+UiEfa1fCgZ8qVBqDWxNupjU1K3T8VCH1rBRJUaotJ
16
+ N3yw41uhVPjLpx6HBN1fbXqYEkDoEpDRVCWtoIxVQRu9JtVH3KHvRSdmt1Kv+vBL
17
+ 7uEbLeD6hNrC5GpLiikV6I1HQUxM7vzAlBmz1doOVTyp/9VpQbPrsd2F6kuL3/xO
18
+ 7KUD3U0xZh6dRUEx+PuCenGYZVcQot4q94dv3ocdo1J60n2DkwIDAQABoyswKTAn
19
+ BgNVHREEIDAegg5hcGkuZ2l0aHViLmNvbYIMc21vY2tlci50ZXN0MA0GCSqGSIb3
20
+ DQEBCwUAA4ICAQA8CzfqD5QsM2/Kz79b4JDhfUafp8oOJdufjiQxCjRn9qZuEqtT
21
+ Qf5GEjEPnV8FH6Oux8qTxWMQQLGdDHzQ217jUtvqdpDog1v+QPVRkoPeP+QTQSfK
22
+ kC+ANGdDt+dbzyRM8b7pxz5KcyMwHHZitAKE2f1xf1gbc70RiJDmif+W4B8lcaWG
23
+ IGoQPB8kAAMhV9r91u49Em3+jKXrhw8J5JBZG7t9006N1ix6ZkocvDqI3mSE9KeY
24
+ dgVzSQdz6KK9BtezqZjpYdRwAJEeoOABsnP7rnTQjDUNb2G/53TOmypORAZXm8sn
25
+ VLuFtP+IymsfFzsSI1H9YhQqd8NN6bDWHH4vttVP1ZXnMZQ2sR4dTLoAkoSMziEF
26
+ EUw24+KI3I9P/hSu6sUIO8WsDdQFV6BECrMrzTN7mIMAg7/JGYDU/LtD7dgeBTuy
27
+ pdxzWVdnrp4WixyHunBuzHo8g8o1ZqHX+HZrfyD3ywTkoWuxoKf0aGpSCallS1Uz
28
+ 2+yRNSzZkEZKEWEljWrToFzazLN/4xRL9GtxGlKEU+xOX0of0LZ+Jx5xNI7iztka
29
+ kPLtItClCEq3S1KixdoYE2Zjkkx17H3qu59zbYrXtF7/3C4UYDL29+Hv6E8YPnUM
30
+ LXlvldSQN3MDScFEFYmT5uxvZcQVhU6TMljNL+qllRjQUj3Z3VTLkR3iiw==
31
+ -----END CERTIFICATE-----
@@ -0,0 +1,29 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIIE6zCCAtMCAQAwbDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWEx
3
+ FjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xFzAVBgNVBAoMDkdpdGxhYiBBdXRob3Jz
4
+ MRcwFQYDVQQDDA5hcGkuZ2l0aHViLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
5
+ ADCCAgoCggIBALxwrEgBMPwRoxJSgow2EtOxD+JrBcFdH6vQEpaPMXpPF1hiXJT+
6
+ 2cflMkDje5QgkOs7WXm90Uytn1d6bM3yoX+VSlNzd+cVA0T33w3NnN0bcOjeE5Nr
7
+ JNFiWN7s/EHdjx6SlsKpbmUmRH18L9PwJMCiDTArzAifTAKAHCK4zUg/My61gZRm
8
+ DECfDaHMgcIXryZ9mGqIobdlwpLBBy3YUvn/1lwLvUCTGikrRgE4ufutF4SELw/A
9
+ 4hZ3EPgTIHcd3izHNP1k45LDJc78UBAUGKgeZ4joLFLgE44ErwoMYZnWC8hCrY4d
10
+ g3GrNcGInnNgQypev11XTMpnT7QS41kQQ7tPBbZaduIUOUHMYheMFVI9zbqlCMWc
11
+ LlieI9twoL4numRm1uJaWjn1YW+0t78VFOI37rik1cqIx4YFsp25g4A1w2PUg7tW
12
+ LqjmWfyzi2KUB7hMk2IgzIoEag/tf5SIR9rV8KBnypUGoNbE26mNTUrdPxUIfWsF
13
+ ElRqi0k3fLDjW6FU+MunHocE3V9tepgSQOgSkNFUJa2gjFVBG70m1Ufcoe9FJ2a3
14
+ Uq/68Evu4Rst4PqE2sLkakuKKRXojUdBTEzu/MCUGbPV2g5VPKn/1WlBs+ux3YXq
15
+ S4vf/E7spQPdTTFmHp1FQTH4+4J6cZhlVxCi3ir3h2/ehx2jUnrSfYOTAgMBAAGg
16
+ OjA4BgkqhkiG9w0BCQ4xKzApMCcGA1UdEQQgMB6CDmFwaS5naXRodWIuY29tggxz
17
+ bW9ja2VyLnRlc3QwDQYJKoZIhvcNAQELBQADggIBAENNxApAwNQsxmHa+q4ZjPax
18
+ 4uUb3Q2sQUqRZN2IAP+HDmlKy8scuhvvCkxuxC7rxZhupoEUR3MJoDAURLfIQLPu
19
+ S3zj1H7iIsi1sY+HDaMKmgK22IudIV3WuVgYcs1bdYHUc+lp1k8Y+KHp80f/hzpU
20
+ nkFVMsddzLglA8Kgt9zqER05iTxBoJfZYbLBzI31aPtmm/DUkAccU19ututbmmtk
21
+ 7XDcDp3FbsgbR/XtkrbuMJGvbs3nyQ6JXK9Mj4AHn+Iucs+mYBULyMYtNbGGCY5h
22
+ AmJdScWAxCxDXEelUpml29dytqZCRBcvcdLwM4srP+VE5lbAkLcR0aETDeRAEshO
23
+ wB8QMZXql8Tc1quKNOr0pxoJZSA0dIjv/tUap8HiuNeEYN0F938uWTb1TQHSs9Dt
24
+ 8d6/SXZZNZNw9xWoeBwdJE1TdcozGnXp6W93+BmGHkOib98FYRWO581Tv12v/x8V
25
+ 9Jys/wzTmH8xrjjHWYlRx+m3yFGMY+Ou0Ee0Tw3lSAOj5tY5IEliVm+c67K57HDY
26
+ zhXajuiRfAXe4bsQN/FjvOJmLGxltEX1q01xWD9kP513LMLJSHQXOj/Iw9WZIBul
27
+ zKVAWqpN4XyvPzu/QAymW95tYUb9ZmByUi9OXpfMuTipN6ogvI3XBEpGkPGVzbgR
28
+ 6ypgdzU8dPZyrsdb0A8s
29
+ -----END CERTIFICATE REQUEST-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-qa
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.14.0
4
+ version: 8.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab Quality
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-12-15 00:00:00.000000000 Z
11
+ date: 2023-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 6.2.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: lefthook
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.2.6
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.2.6
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: pry
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -310,6 +324,9 @@ files:
310
324
  - docs/README.md
311
325
  - docs/architecture.md
312
326
  - docs/configuring_omnibus.md
327
+ - docs/developer/http_mocking.md
328
+ - docs/developer/ssl.md
329
+ - docs/developer/style_guide.md
313
330
  - docs/how_it_works.md
314
331
  - docs/omnibus_configurations/license_mode.md
315
332
  - docs/release_process.md
@@ -325,7 +342,9 @@ files:
325
342
  - fixtures/ldap/3_add_groups.ldif
326
343
  - fixtures/ldap/tanuki.ldif
327
344
  - gitlab-qa.gemspec
345
+ - lefthook.yml
328
346
  - lib/gitlab/qa.rb
347
+ - lib/gitlab/qa/component/alpine.rb
329
348
  - lib/gitlab/qa/component/base.rb
330
349
  - lib/gitlab/qa/component/chaos.rb
331
350
  - lib/gitlab/qa/component/elasticsearch.rb
@@ -467,6 +486,9 @@ files:
467
486
  - tls_certificates/gitlab/gitlab.test.crt
468
487
  - tls_certificates/gitlab/gitlab.test.csr
469
488
  - tls_certificates/gitlab/gitlab.test.key
489
+ - tls_certificates/smocker/smocker.crt
490
+ - tls_certificates/smocker/smocker.csr
491
+ - tls_certificates/smocker/smocker.key
470
492
  - tmp/.gitignore
471
493
  homepage: http://about.gitlab.com/
472
494
  licenses: