gitlab-qa 8.4.1 → 8.5.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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/.gitlab/ci/jobs/base.gitlab-ci.yml +1 -3
  3. data/.rubocop_todo.yml +0 -12
  4. data/Gemfile.lock +1 -1
  5. data/exe/gitlab-qa +1 -1
  6. data/lib/gitlab/qa/component/base.rb +2 -2
  7. data/lib/gitlab/qa/component/gitlab.rb +1 -1
  8. data/lib/gitlab/qa/component/staging.rb +17 -35
  9. data/lib/gitlab/qa/component/suggested_reviewer.rb +47 -0
  10. data/lib/gitlab/qa/docker/command.rb +3 -14
  11. data/lib/gitlab/qa/docker/engine.rb +1 -1
  12. data/lib/gitlab/qa/release.rb +6 -2
  13. data/lib/gitlab/qa/report/results_reporter_shared.rb +1 -1
  14. data/lib/gitlab/qa/runtime/env.rb +7 -0
  15. data/lib/gitlab/qa/scenario/test/integration/suggested_reviewer.rb +62 -0
  16. data/lib/gitlab/qa/scenario/test/omnibus/update_from_previous.rb +1 -1
  17. data/lib/gitlab/qa/service/cluster_provider/base.rb +33 -0
  18. data/lib/gitlab/qa/service/cluster_provider/k3d.rb +141 -0
  19. data/lib/gitlab/qa/service/kubernetes_cluster.rb +62 -0
  20. data/lib/gitlab/qa/support/gitlab_version_info.rb +4 -1
  21. data/lib/gitlab/qa/support/shell_command.rb +98 -0
  22. data/lib/gitlab/qa/support/shellout.rb +16 -0
  23. data/lib/gitlab/qa/version.rb +1 -1
  24. data/lib/gitlab/qa.rb +1 -1
  25. data/support/manifests/suggested_reviewer/authenticator.yaml +41 -0
  26. data/support/manifests/suggested_reviewer/postgres.yaml +84 -0
  27. data/support/manifests/suggested_reviewer/pubsub.yaml +41 -0
  28. data/support/manifests/suggested_reviewer/recommender-bot.yaml +242 -0
  29. data/support/manifests/suggested_reviewer/recommender.yaml +52 -0
  30. metadata +14 -4
  31. data/lib/gitlab/qa/docker/shellout.rb +0 -77
  32. data/lib/gitlab/qa/support/dev_ee_qa_image.rb +0 -54
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+ require 'active_support/core_ext/string/filters'
5
+
6
+ module Gitlab
7
+ module QA
8
+ module Support
9
+ class ShellCommand
10
+ using Rainbow
11
+
12
+ StatusError = Class.new(StandardError)
13
+
14
+ # Shell command
15
+ #
16
+ # @param [<String, Array>] command
17
+ # @param [<String, Array>] mask_secrets
18
+ # @param [Boolean] stream_output stream command output to stdout directly instead of logger
19
+ def initialize(command = nil, stdin_data: nil, mask_secrets: nil, stream_output: false)
20
+ @command = command
21
+ @mask_secrets = Array(mask_secrets)
22
+ @stream_output = stream_output
23
+ @output = []
24
+ @logger = Runtime::Logger.logger
25
+ @stdin_data = stdin_data
26
+ end
27
+
28
+ attr_reader :command, :output, :stream_output
29
+
30
+ def execute! # rubocop:disable Metrics/AbcSize
31
+ raise StatusError, 'Command already executed' if output.any?
32
+
33
+ logger.info("Shell command: `#{mask_secrets(command).cyan}`")
34
+
35
+ Open3.popen2e(@command.to_s) do |stdin, out, wait|
36
+ if @stdin_data
37
+ stdin.puts(@stdin_data)
38
+ stdin.close
39
+ end
40
+
41
+ out.each do |line|
42
+ output.push(line)
43
+
44
+ if stream_progress
45
+ print "."
46
+ elsif stream_output
47
+ puts line
48
+ end
49
+
50
+ yield line, wait if block_given?
51
+ end
52
+ puts if stream_progress && !output.empty?
53
+
54
+ fail! if wait.value.exited? && wait.value.exitstatus.nonzero?
55
+
56
+ logger.debug("Shell command output:\n#{string_output}") unless stream_output || output.empty?
57
+ end
58
+
59
+ string_output
60
+ end
61
+
62
+ private
63
+
64
+ attr_reader :logger
65
+
66
+ # Raise error and print output to error log level
67
+ #
68
+ # @return [void]
69
+ def fail!
70
+ logger.error("Shell command output:\n#{string_output}") unless stream_output
71
+ raise StatusError, "Command `#{mask_secrets(command).truncate(100)}` failed! " + "✘".red
72
+ end
73
+
74
+ # Stream only command execution progress and log output when command finished
75
+ #
76
+ # @return [Boolean]
77
+ def stream_progress
78
+ !(Runtime::Env.ci || stream_output)
79
+ end
80
+
81
+ # Stringified command output
82
+ #
83
+ # @return [String]
84
+ def string_output
85
+ mask_secrets(output.join.chomp)
86
+ end
87
+
88
+ # Returns a masked string
89
+ #
90
+ # @param [String] input the string to mask
91
+ # @return [String] The masked string
92
+ def mask_secrets(input)
93
+ @mask_secrets.each_with_object(+input) { |secret, s| s.gsub!(secret, '*****') }.to_s
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gitlab
4
+ module QA
5
+ module Support
6
+ module Shellout
7
+ module_function
8
+
9
+ def shell(command = nil, stdin_data: nil, mask_secrets: nil, stream_output: false, &block)
10
+ Support::ShellCommand.new(
11
+ command, stdin_data: stdin_data, mask_secrets: mask_secrets, stream_output: stream_output).execute!(&block)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Gitlab
4
4
  module QA
5
- VERSION = '8.4.1'
5
+ VERSION = '8.5.0'
6
6
  end
7
7
  end
data/lib/gitlab/qa.rb CHANGED
@@ -7,9 +7,9 @@ module Gitlab
7
7
  module QA
8
8
  loader = Zeitwerk::Loader.new
9
9
  loader.push_dir("#{__dir__}/qa", namespace: Gitlab::QA)
10
+ loader.ignore("#{__dir__}/qa/version.rb")
10
11
 
11
12
  loader.inflector.inflect(
12
- 'dev_ee_qa_image' => 'DevEEQAImage',
13
13
  'results_in_testcases' => 'ResultsInTestCases',
14
14
  'postgresql' => 'PostgreSQL',
15
15
  'registry_with_cdn' => 'RegistryWithCDN',
@@ -0,0 +1,41 @@
1
+ ---
2
+ apiVersion: apps/v1
3
+ kind: Deployment
4
+ metadata:
5
+ name: authenticator-deployment
6
+ labels:
7
+ app: authenticator
8
+ spec:
9
+ replicas: 1
10
+ selector:
11
+ matchLabels:
12
+ app: authenticator
13
+ template:
14
+ metadata:
15
+ labels:
16
+ app: authenticator
17
+ spec:
18
+ imagePullSecrets:
19
+ - name: gitlab-registry
20
+ containers:
21
+ - name: authenticator
22
+ image: registry.gitlab.com/gitlab-org/modelops/applied-ml/review-recommender/authenticator:0.1.0
23
+ imagePullPolicy: Always
24
+ ports:
25
+ - containerPort: 8080
26
+ args: []
27
+ env:
28
+ - name: AUTHENTICATOR_SERVICE_PORT
29
+ value: "8080"
30
+ ---
31
+ apiVersion: v1
32
+ kind: Service
33
+ metadata:
34
+ name: authenticator-service
35
+ spec:
36
+ type: NodePort
37
+ ports:
38
+ - port: 8080
39
+ targetPort: 8080
40
+ selector:
41
+ app: authenticator
@@ -0,0 +1,84 @@
1
+ ---
2
+ apiVersion: v1
3
+ kind: Secret
4
+ metadata:
5
+ name: postgres-secret
6
+ type: kubernetes.io/basic-auth
7
+ stringData:
8
+ username: reviewer-recommender
9
+ password: ml4dawin
10
+
11
+ ---
12
+ apiVersion: v1
13
+ kind: PersistentVolumeClaim
14
+ metadata:
15
+ name: postgres-pvc
16
+ spec:
17
+ storageClassName: local-path
18
+ accessModes:
19
+ - ReadWriteOnce
20
+ resources:
21
+ requests:
22
+ storage: 1Gi
23
+
24
+ ---
25
+ apiVersion: apps/v1
26
+ kind: Deployment
27
+ metadata:
28
+ name: postgres-deployment
29
+ spec:
30
+ replicas: 1
31
+ selector:
32
+ matchLabels:
33
+ app: postgres
34
+ template:
35
+ metadata:
36
+ labels:
37
+ app: postgres
38
+ spec:
39
+ containers:
40
+ - name: postgres
41
+ image: postgres:13-alpine
42
+ imagePullPolicy: IfNotPresent
43
+ ports:
44
+ - containerPort: 5432
45
+ volumeMounts:
46
+ - name: postgres-pv
47
+ mountPath: /var/lib/postgresql/data
48
+ subPath: postgres
49
+ resources:
50
+ limits:
51
+ memory: 256Mi
52
+ cpu: 250m
53
+ env:
54
+ - name: POSTGRES_DB
55
+ value: reviewer-recommender
56
+ - name: POSTGRES_USER
57
+ valueFrom:
58
+ secretKeyRef:
59
+ name: postgres-secret
60
+ key: username
61
+ - name: POSTGRES_PASSWORD
62
+ valueFrom:
63
+ secretKeyRef:
64
+ name: postgres-secret
65
+ key: password
66
+ volumes:
67
+ - name: postgres-pv
68
+ persistentVolumeClaim:
69
+ claimName: postgres-pvc
70
+
71
+ ---
72
+ apiVersion: v1
73
+ kind: Service
74
+ metadata:
75
+ name: postgres
76
+ labels:
77
+ app: postgres
78
+ spec:
79
+ type: ClusterIP
80
+ selector:
81
+ app: postgres
82
+ ports:
83
+ - port: 5432
84
+ targetPort: 5432
@@ -0,0 +1,41 @@
1
+ ---
2
+ apiVersion: apps/v1
3
+ kind: Deployment
4
+ metadata:
5
+ name: pubsub-deployment
6
+ labels:
7
+ app: pubsub
8
+ spec:
9
+ replicas: 1
10
+ selector:
11
+ matchLabels:
12
+ app: pubsub
13
+ template:
14
+ metadata:
15
+ labels:
16
+ app: pubsub
17
+ spec:
18
+ containers:
19
+ - name: pubsub
20
+ image: singularities/pubsub-emulator:latest
21
+ imagePullPolicy: IfNotPresent
22
+ env:
23
+ - name: PUBSUB_PROJECT_ID
24
+ value: project-test
25
+ - name: PUBSUB_LISTEN_ADDRESS
26
+ value: 0.0.0.0:8432
27
+
28
+ ---
29
+ apiVersion: v1
30
+ kind: Service
31
+ metadata:
32
+ name: pubsub
33
+ labels:
34
+ app: pubsub
35
+ spec:
36
+ type: ClusterIP
37
+ selector:
38
+ app: pubsub
39
+ ports:
40
+ - port: 8432
41
+ targetPort: 8432
@@ -0,0 +1,242 @@
1
+ ---
2
+ apiVersion: v1
3
+ kind: Secret
4
+ metadata:
5
+ name: gcp-credentials
6
+ type: Opaque
7
+ data:
8
+ gcp_json: "ewogICJjbGllbnRfaWQiOiAiMTIzNDU2Nzg5YWJjZGVmZy5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsCiAgImNsaWVudF9zZWNyZXQiOiAiZC1GTHlld3VxeWV1cXciLAogICJxdW90YV9wcm9qZWN0X2lkIjogInN1Z2dlc3RlZC1yZXZpZXdlci0xNTA0MDBlNiIsCiAgInJlZnJlc2hfdG9rZW4iOiAiMS8vMTIzNDU2NzhhYmNkZWZnIiwKICAidHlwZSI6ICJhdXRob3JpemVkX3VzZXIiCn0K"
9
+
10
+ ---
11
+ apiVersion: v1
12
+ kind: ConfigMap
13
+ metadata:
14
+ name: recommender-bot-envoy-sidecar-config
15
+ labels:
16
+ app: recommender-bot
17
+ data:
18
+ envoy.yaml: |
19
+ static_resources:
20
+ listeners:
21
+ - name: "recommender-bot-http-listener"
22
+ address:
23
+ socket_address: { address: "0.0.0.0", port_value: 8282 }
24
+ filter_chains:
25
+ - filters:
26
+ - name: "envoy.filters.network.http_connection_manager"
27
+ typed_config:
28
+ "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
29
+ stat_prefix: "grpc_json"
30
+ codec_type: "AUTO"
31
+ route_config:
32
+ name: "local_route"
33
+ virtual_hosts:
34
+ - name: "local_service"
35
+ domains: [ "*" ]
36
+ routes:
37
+ - match: { prefix: "/", grpc: {} }
38
+ route: { cluster: "recommender-bot", timeout: 60s }
39
+ http_filters:
40
+ - name: "envoy.filters.http.grpc_json_transcoder"
41
+ typed_config:
42
+ "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder
43
+ proto_descriptor: "/data/protos/recommender-bot.protoset.pb"
44
+ services: [ "bot.RecommenderService" ]
45
+ print_options:
46
+ add_whitespace: true
47
+ always_print_primitive_fields: true
48
+ always_print_enums_as_ints: false
49
+ preserve_proto_field_names: false
50
+ convert_grpc_status: true
51
+ request_validation_options:
52
+ reject_unknown_method: true
53
+ reject_unknown_query_parameters: true
54
+ - name: "envoy.filters.http.router"
55
+ - name: "recommender-bot-http-auth-listener"
56
+ address:
57
+ socket_address: { address: "0.0.0.0", port_value: 8484 }
58
+ filter_chains:
59
+ - filters:
60
+ - name: "envoy.filters.network.http_connection_manager"
61
+ typed_config:
62
+ "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
63
+ stat_prefix: "grpc_json"
64
+ codec_type: "AUTO"
65
+ route_config:
66
+ name: "local_route"
67
+ virtual_hosts:
68
+ - name: "local_service"
69
+ domains: [ "*" ]
70
+ routes:
71
+ - match: { prefix: "/", grpc: {} }
72
+ route: { cluster: "recommender-bot", timeout: 60s }
73
+ http_filters:
74
+ - name: "envoy.filters.http.grpc_json_transcoder"
75
+ typed_config:
76
+ "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder
77
+ proto_descriptor: "/data/protos/recommender-bot.protoset.pb"
78
+ services: [ "bot.RecommenderService" ]
79
+ print_options:
80
+ add_whitespace: true
81
+ always_print_primitive_fields: true
82
+ always_print_enums_as_ints: false
83
+ preserve_proto_field_names: false
84
+ convert_grpc_status: true
85
+ request_validation_options:
86
+ reject_unknown_method: true
87
+ reject_unknown_query_parameters: true
88
+ - name: "envoy.filters.http.ext_authz"
89
+ typed_config:
90
+ "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
91
+ http_service:
92
+ server_uri:
93
+ uri: "http://authenticator-service:8080"
94
+ cluster: "ext-auth"
95
+ timeout: 60s
96
+ authorization_request:
97
+ allowed_headers:
98
+ patterns:
99
+ - { exact: "Job-Token", ignore_case: true }
100
+ - { exact: "Project-Id", ignore_case: true }
101
+ failure_mode_allow: false
102
+ - name: "envoy.filters.http.router"
103
+
104
+ clusters:
105
+ - name: "recommender-bot"
106
+ connect_timeout: "1.25s"
107
+ type: "STATIC"
108
+ lb_policy: "ROUND_ROBIN"
109
+ dns_lookup_family: V4_ONLY
110
+ typed_extension_protocol_options:
111
+ envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
112
+ "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
113
+ explicit_http_config:
114
+ http2_protocol_options: { }
115
+ load_assignment:
116
+ cluster_name: "recommender-bot"
117
+ endpoints:
118
+ - lb_endpoints:
119
+ - endpoint:
120
+ address:
121
+ socket_address:
122
+ address: "127.0.0.1"
123
+ port_value: 8080
124
+ - name: "ext-auth"
125
+ connect_timeout: "1.25s"
126
+ type: "LOGICAL_DNS"
127
+ lb_policy: "ROUND_ROBIN"
128
+ load_assignment:
129
+ cluster_name: "ext-auth"
130
+ endpoints:
131
+ - lb_endpoints:
132
+ - endpoint:
133
+ address:
134
+ socket_address:
135
+ address: "authenticator-service"
136
+ port_value: 8080
137
+
138
+ ---
139
+ apiVersion: apps/v1
140
+ kind: Deployment
141
+ metadata:
142
+ name: recommender-bot-deployment
143
+ labels:
144
+ app: recommender-bot
145
+ spec:
146
+ replicas: 1
147
+ selector:
148
+ matchLabels:
149
+ app: recommender-bot
150
+ template:
151
+ metadata:
152
+ labels:
153
+ app: recommender-bot
154
+ spec:
155
+ initContainers:
156
+ - name: protosets
157
+ image: recommender-bot-service:dev
158
+ imagePullPolicy: Never
159
+ command: [sh, -c]
160
+ args: [cp /app/recommender-bot.protoset.pb /data/protos]
161
+ volumeMounts:
162
+ - name: grpc-protosets
163
+ mountPath: /data/protos
164
+ containers:
165
+ - name: recommender-bot-envoy-sidecar
166
+ image: envoyproxy/envoy-alpine:v1.19-latest
167
+ imagePullPolicy: IfNotPresent
168
+ ports:
169
+ - containerPort: 8282
170
+ - containerPort: 8484
171
+ volumeMounts:
172
+ - name: recommender-bot-envoy-sidecar-config
173
+ mountPath: /etc/envoy
174
+ - name: grpc-protosets
175
+ mountPath: /data/protos
176
+ readOnly: true
177
+ - name: recommender-bot
178
+ image: recommender-bot-service:dev
179
+ imagePullPolicy: Never
180
+ ports:
181
+ - containerPort: 8080
182
+ env:
183
+ - name: RECOMMENDER_BOT_SERVICE_PORT
184
+ value: "8080"
185
+ - name: RECOMMENDER_BOT_GITLAB_TOKEN
186
+ valueFrom:
187
+ secretKeyRef:
188
+ name: recommender-bot-gitlab-token
189
+ key: token
190
+ - name: RECOMMENDER_BOT_GRPC_SERVICE_URL
191
+ value: recommender-service:8080
192
+ - name: RECOMMENDER_BOT_PG_CONN_STRING
193
+ valueFrom:
194
+ secretKeyRef:
195
+ name: recommender-bot-pg-conn-string
196
+ key: pg-conn
197
+ - name: PUBSUB_EMULATOR_HOST
198
+ value: pubsub:8432
199
+ - name: GOOGLE_APPLICATION_CREDENTIALS
200
+ value: /data/gcp/gcp_credentials.json
201
+ - name: RECOMMENDER_BOT_PUBSUB_PROJECT_ID
202
+ value: project-test
203
+ - name: RECOMMENDER_BOT_PUBSUB_TOPIC_RECOMMENDATIONS
204
+ value: gitlab.merge-request-recommendations-test.1
205
+ volumeMounts:
206
+ - name: gcp-secrets
207
+ mountPath: /data/gcp
208
+ readOnly: true
209
+ volumes:
210
+ - name: grpc-protosets
211
+ emptyDir: {}
212
+ - name: recommender-bot-envoy-sidecar-config
213
+ configMap:
214
+ name: recommender-bot-envoy-sidecar-config
215
+ - name: gcp-secrets
216
+ secret:
217
+ secretName: gcp-credentials
218
+ items:
219
+ - key: gcp_json
220
+ path: gcp_credentials.json
221
+
222
+ ---
223
+ apiVersion: v1
224
+ kind: Service
225
+ metadata:
226
+ name: recommender-bot-service
227
+ labels:
228
+ app: recommender-bot
229
+ spec:
230
+ type: NodePort
231
+ ports:
232
+ - name: http-plain
233
+ port: 8282
234
+ targetPort: 8282
235
+ - name: http-auth
236
+ port: 8484
237
+ targetPort: 8484
238
+ - name: grpc
239
+ port: 8080
240
+ targetPort: 8080
241
+ selector:
242
+ app: recommender-bot
@@ -0,0 +1,52 @@
1
+ ---
2
+ apiVersion: apps/v1
3
+ kind: Deployment
4
+ metadata:
5
+ name: recommender-deployment
6
+ labels:
7
+ app: recommender
8
+ spec:
9
+ replicas: 1
10
+ selector:
11
+ matchLabels:
12
+ app: recommender
13
+ template:
14
+ metadata:
15
+ labels:
16
+ app: recommender
17
+ spec:
18
+ containers:
19
+ - name: recommender
20
+ image: recommender-service:dev
21
+ imagePullPolicy: Never
22
+ ports:
23
+ - containerPort: 8080
24
+ volumeMounts:
25
+ - name: models-mount
26
+ mountPath: /app/data/models
27
+ env:
28
+ - name: RECOMMENDER_SERVICE_PORT
29
+ value: "8080"
30
+ - name: RECOMMENDER_MODELS_STORAGE
31
+ value: local
32
+ - name: GRPC_VERBOSITY
33
+ value: debug
34
+ volumes:
35
+ - name: models-mount
36
+ hostPath:
37
+ path: /tmp/gitlab-qa/suggested_reviewer/data/models
38
+
39
+ ---
40
+ apiVersion: v1
41
+ kind: Service
42
+ metadata:
43
+ name: recommender-service
44
+ labels:
45
+ app: recommender
46
+ spec:
47
+ type: ClusterIP
48
+ ports:
49
+ - port: 8080
50
+ targetPort: 8080
51
+ selector:
52
+ app: recommender
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.4.1
4
+ version: 8.5.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-09-01 00:00:00.000000000 Z
11
+ date: 2022-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control
@@ -327,10 +327,10 @@ files:
327
327
  - lib/gitlab/qa/component/specs.rb
328
328
  - lib/gitlab/qa/component/staging.rb
329
329
  - lib/gitlab/qa/component/staging_ref.rb
330
+ - lib/gitlab/qa/component/suggested_reviewer.rb
330
331
  - lib/gitlab/qa/component/telegraf.rb
331
332
  - lib/gitlab/qa/docker/command.rb
332
333
  - lib/gitlab/qa/docker/engine.rb
333
- - lib/gitlab/qa/docker/shellout.rb
334
334
  - lib/gitlab/qa/docker/volumes.rb
335
335
  - lib/gitlab/qa/release.rb
336
336
  - lib/gitlab/qa/report/base_test_results.rb
@@ -408,23 +408,33 @@ files:
408
408
  - lib/gitlab/qa/scenario/test/integration/service_ping_disabled.rb
409
409
  - lib/gitlab/qa/scenario/test/integration/smtp.rb
410
410
  - lib/gitlab/qa/scenario/test/integration/ssh_tunnel.rb
411
+ - lib/gitlab/qa/scenario/test/integration/suggested_reviewer.rb
411
412
  - lib/gitlab/qa/scenario/test/omnibus/image.rb
412
413
  - lib/gitlab/qa/scenario/test/omnibus/update.rb
413
414
  - lib/gitlab/qa/scenario/test/omnibus/update_from_previous.rb
414
415
  - lib/gitlab/qa/scenario/test/omnibus/upgrade.rb
415
416
  - lib/gitlab/qa/scenario/test/sanity/version.rb
417
+ - lib/gitlab/qa/service/cluster_provider/base.rb
418
+ - lib/gitlab/qa/service/cluster_provider/k3d.rb
419
+ - lib/gitlab/qa/service/kubernetes_cluster.rb
416
420
  - lib/gitlab/qa/slack/post_to_slack.rb
417
- - lib/gitlab/qa/support/dev_ee_qa_image.rb
418
421
  - lib/gitlab/qa/support/get_request.rb
419
422
  - lib/gitlab/qa/support/gitlab_upgrade_path.rb
420
423
  - lib/gitlab/qa/support/gitlab_version_info.rb
421
424
  - lib/gitlab/qa/support/http_request.rb
422
425
  - lib/gitlab/qa/support/invalid_response_error.rb
426
+ - lib/gitlab/qa/support/shell_command.rb
427
+ - lib/gitlab/qa/support/shellout.rb
423
428
  - lib/gitlab/qa/test_logger.rb
424
429
  - lib/gitlab/qa/version.rb
425
430
  - scripts/generate-qa-jobs.rb
426
431
  - support/data/admin_access_token_seed.rb
427
432
  - support/data/license_usage_seed.rb
433
+ - support/manifests/suggested_reviewer/authenticator.yaml
434
+ - support/manifests/suggested_reviewer/postgres.yaml
435
+ - support/manifests/suggested_reviewer/pubsub.yaml
436
+ - support/manifests/suggested_reviewer/recommender-bot.yaml
437
+ - support/manifests/suggested_reviewer/recommender.yaml
428
438
  - tls_certificates/authority/ca.crt
429
439
  - tls_certificates/authority/ca.key
430
440
  - tls_certificates/authority/ca.pem