gitlab-qa 8.4.2 → 8.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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.2'
5
+ VERSION = '8.5.0'
6
6
  end
7
7
  end
data/lib/gitlab/qa.rb CHANGED
@@ -10,7 +10,6 @@ module Gitlab
10
10
  loader.ignore("#{__dir__}/qa/version.rb")
11
11
 
12
12
  loader.inflector.inflect(
13
- 'dev_ee_qa_image' => 'DevEEQAImage',
14
13
  'results_in_testcases' => 'ResultsInTestCases',
15
14
  'postgresql' => 'PostgreSQL',
16
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.2
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-07 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