airbyte-source-gitlab 3.0.0.dev202403072311__py3-none-any.whl → 4.0.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,614 @@
1
+ version: 0.78.1
2
+ type: DeclarativeSource
3
+
4
+ definitions:
5
+ # Authenticators
6
+ bearer_authenticator:
7
+ type: BearerAuthenticator
8
+ api_token: "{{ config['credentials']['access_token'] }}"
9
+ oauth_authenticator:
10
+ type: OAuthAuthenticator
11
+ client_id: "{{ config['credentials']['client_id'] }}"
12
+ client_secret: "{{ config['credentials']['client_secret'] }}"
13
+ refresh_token: "{{ config['credentials']['refresh_token'] }}"
14
+ token_refresh_endpoint: "https://{{ config.get('api_url', 'gitlab.com') }}/oauth/token"
15
+ refresh_token_updater:
16
+ refresh_token_error_status_codes: [400, 401]
17
+ refresh_token_error_key: "error"
18
+ refresh_token_error_values: ["invalid_grant"]
19
+ authenticator:
20
+ type: SelectiveAuthenticator
21
+ authenticator_selection_path: ["credentials", "auth_type"]
22
+ authenticators:
23
+ oauth2.0: "#/definitions/oauth_authenticator"
24
+ access_token: "#/definitions/bearer_authenticator"
25
+
26
+ # Requester
27
+ requester:
28
+ type: HttpRequester
29
+ url_base: >-
30
+ {% set parts = config.get('api_url', 'gitlab.com').split('://') %}
31
+ {{ parts[0] if parts|length > 1 else 'https' }}://{{ parts[1] if parts[1] else parts[0] }}/api/v4/
32
+ http_method: GET
33
+ authenticator: "#/definitions/authenticator"
34
+ use_cache: true
35
+ error_handler:
36
+ type: DefaultErrorHandler
37
+ response_filters:
38
+ - type: HttpResponseFilter
39
+ action: IGNORE
40
+ http_codes: [403]
41
+ - type: HttpResponseFilter
42
+ action: FAIL
43
+ http_codes: [401]
44
+ error_message: Unable to refresh the `access_token`, please re-authenticate in Sources > Settings.
45
+ - type: HttpResponseFilter
46
+ action: FAIL
47
+ http_codes: [500]
48
+ error_message: Unable to connect to Gitlab API with the provided credentials
49
+ - type: HttpResponseFilter
50
+ action: FAIL
51
+ http_codes: [404]
52
+ error_message: Groups and/or projects that you provide are invalid or you don't have permission to view it.
53
+ request_parameters: "{{ parameters.get('request_parameters', {}) }}"
54
+
55
+ # Selector
56
+ selector:
57
+ type: RecordSelector
58
+ extractor:
59
+ type: DpathExtractor
60
+ field_path: []
61
+
62
+ # Paginator
63
+ paginator:
64
+ type: DefaultPaginator
65
+ pagination_strategy:
66
+ type: PageIncrement
67
+ page_size: 50
68
+ start_from_page: 1
69
+ inject_on_first_request: false
70
+ page_size_option:
71
+ type: RequestOption
72
+ field_name: per_page
73
+ inject_into: request_parameter
74
+ page_token_option:
75
+ type: RequestOption
76
+ field_name: page
77
+ inject_into: request_parameter
78
+
79
+ # Retrievers
80
+ retriever:
81
+ type: SimpleRetriever
82
+ record_selector: "#/definitions/selector"
83
+ requester: "#/definitions/requester"
84
+ paginator: "#/definitions/paginator"
85
+
86
+ group_streams_retriever:
87
+ $ref: "#/definitions/retriever"
88
+ partition_router:
89
+ type: CustomPartitionRouter
90
+ class_name: source_gitlab.components.partition_routers.GroupStreamsPartitionRouter
91
+ parent_stream_configs:
92
+ - type: ParentStreamConfig
93
+ parent_key: "id"
94
+ stream: "#/definitions/groups_list_stream"
95
+ partition_field: "id"
96
+ - type: ParentStreamConfig
97
+ parent_key: "id"
98
+ stream: "#/definitions/include_descendant_groups_stream"
99
+ partition_field: "id"
100
+
101
+ group_child_streams_retriever:
102
+ $ref: "#/definitions/retriever"
103
+ partition_router:
104
+ type: SubstreamPartitionRouter
105
+ parent_stream_configs:
106
+ - type: ParentStreamConfig
107
+ parent_key: "id"
108
+ stream: "#/definitions/groups_stream"
109
+ partition_field: "id"
110
+
111
+ projects_streams_retriever:
112
+ $ref: "#/definitions/retriever"
113
+ partition_router:
114
+ type: CustomPartitionRouter
115
+ class_name: source_gitlab.components.partition_routers.ProjectStreamsPartitionRouter
116
+ parent_stream_configs:
117
+ - type: ParentStreamConfig
118
+ parent_key: "id"
119
+ stream: "#/definitions/groups_stream"
120
+ partition_field: "id"
121
+
122
+ projects_child_streams_retriever:
123
+ $ref: "#/definitions/retriever"
124
+ partition_router:
125
+ type: SubstreamPartitionRouter
126
+ parent_stream_configs:
127
+ - type: ParentStreamConfig
128
+ parent_key: "id"
129
+ stream: "#/definitions/projects_stream"
130
+ partition_field: "id"
131
+
132
+ pipelines_child_streams_retriever:
133
+ $ref: "#/definitions/retriever"
134
+ partition_router:
135
+ type: SubstreamPartitionRouter
136
+ parent_stream_configs:
137
+ - type: ParentStreamConfig
138
+ parent_key: "id"
139
+ stream: "#/definitions/pipelines_stream"
140
+ partition_field: "id"
141
+
142
+ # Transformations
143
+ add_project_id_field:
144
+ type: AddFields
145
+ fields:
146
+ - type: AddedFieldDefinition
147
+ path: ["project_id"]
148
+ value: "{{ stream_slice.id }}"
149
+
150
+ add_group_id_field:
151
+ type: AddFields
152
+ fields:
153
+ - type: AddedFieldDefinition
154
+ path: ["group_id"]
155
+ value: "{{ stream_slice.id }}"
156
+
157
+ # Service streams
158
+ base_full_refresh_stream:
159
+ type: DeclarativeStream
160
+ primary_key: "id"
161
+
162
+ base_groups_child_stream:
163
+ $ref: "#/definitions/base_full_refresh_stream"
164
+ retriever: "#/definitions/group_child_streams_retriever"
165
+
166
+ base_projects_child_stream:
167
+ $ref: "#/definitions/base_full_refresh_stream"
168
+ retriever: "#/definitions/projects_child_streams_retriever"
169
+
170
+ base_projects_incremental_child_stream:
171
+ $ref: "#/definitions/base_projects_child_stream"
172
+ incremental_sync:
173
+ type: DatetimeBasedCursor
174
+ cursor_field: "{{ parameters.get('cursor_field', 'updated_at') }}"
175
+ start_datetime: "{{ config.get('start_date', '2014-01-01T00:00:00Z') }}"
176
+ datetime_format: "%Y-%m-%dT%H:%M:%SZ"
177
+ cursor_datetime_formats:
178
+ - "%Y-%m-%dT%H:%M:%S.%f%z"
179
+ - "%Y-%m-%dT%H:%M:%S.%fZ"
180
+ - "%Y-%m-%dT%H:%M:%S%z"
181
+ - "%Y-%m-%dT%H:%M:%SZ"
182
+ cursor_granularity: "PT1S"
183
+ step: "P180DT1S"
184
+ start_time_option:
185
+ type: RequestOption
186
+ field_name: "{{ parameters.get('lower_bound_filter', 'updated_after') }}"
187
+ inject_into: request_parameter
188
+ end_time_option:
189
+ type: RequestOption
190
+ field_name: "{{ parameters.get('upper_bound_filter', 'updated_before') }}"
191
+ inject_into: request_parameter
192
+
193
+ groups_list_stream:
194
+ name: "groups_list"
195
+ $ref: "#/definitions/base_full_refresh_stream"
196
+ retriever: "#/definitions/retriever"
197
+ $parameters:
198
+ path: "groups"
199
+ request_parameters: {}
200
+
201
+ include_descendant_groups_stream:
202
+ name: "include_descendant_groups"
203
+ $ref: "#/definitions/base_full_refresh_stream"
204
+ retriever:
205
+ $ref: "#/definitions/retriever"
206
+ partition_router:
207
+ type: ListPartitionRouter
208
+ cursor_field: "slice"
209
+ values: |
210
+ {% set slices = [] %}
211
+ {% for group_id in config.get('groups_list', []) %}
212
+ {% set _ = slices.append({'path': 'groups/' + group_id}) %}
213
+ {% set _ = slices.append({'path': 'groups/' + group_id + '/descendant_groups'}) %}
214
+ {% endfor %}
215
+ {{ slices }}
216
+ $parameters:
217
+ path: "{{ stream_slice.slice.path }}"
218
+ request_parameters: {}
219
+
220
+ # Full refresh streams
221
+ ## Groups-based streams
222
+ groups_stream:
223
+ name: "groups"
224
+ $ref: "#/definitions/base_full_refresh_stream"
225
+ retriever: "#/definitions/group_streams_retriever"
226
+ transformations:
227
+ - type: AddFields
228
+ fields:
229
+ - type: AddedFieldDefinition
230
+ path:
231
+ - projects
232
+ value: |
233
+ {% set projects = [] %}
234
+ {% for project in (record.get('projects') or []): %}
235
+ {% set _ = projects.append({'id': project['id'], 'path_with_namespace': project['path_with_namespace']}) %}
236
+ {% endfor %}
237
+ {{ projects }}
238
+ $parameters:
239
+ path: "groups/{{ stream_slice.id }}"
240
+ request_parameters: {}
241
+
242
+ group_milestones_stream:
243
+ name: "group_milestones"
244
+ $ref: "#/definitions/base_groups_child_stream"
245
+ $parameters:
246
+ path: "groups/{{ stream_slice.id }}/milestones"
247
+
248
+ group_members_stream:
249
+ name: "group_members"
250
+ $ref: "#/definitions/base_groups_child_stream"
251
+ primary_key: ["group_id", "id"]
252
+ transformations:
253
+ - "#/definitions/add_group_id_field"
254
+ $parameters:
255
+ path: "groups/{{ stream_slice.id }}/members"
256
+
257
+ group_labels_stream:
258
+ name: "group_labels"
259
+ $ref: "#/definitions/base_groups_child_stream"
260
+ primary_key: ["group_id", "id"]
261
+ transformations:
262
+ - "#/definitions/add_group_id_field"
263
+ $parameters:
264
+ path: "groups/{{ stream_slice.id }}/labels"
265
+
266
+ group_issue_boards_stream:
267
+ name: "group_issue_boards"
268
+ $ref: "#/definitions/base_groups_child_stream"
269
+ transformations:
270
+ - "#/definitions/add_group_id_field"
271
+ $parameters:
272
+ path: "groups/{{ stream_slice.id }}/boards"
273
+
274
+ epics_stream:
275
+ name: "epics"
276
+ $ref: "#/definitions/base_groups_child_stream"
277
+ transformations:
278
+ - type: AddFields
279
+ fields:
280
+ - type: AddedFieldDefinition
281
+ path: ["author_id"]
282
+ value: "{{ (record.get('author') or {}).get('id') }}"
283
+ primary_key: "iid"
284
+ $parameters:
285
+ path: "groups/{{ stream_slice.id }}/epics"
286
+
287
+ epic_issues_stream:
288
+ name: "epic_issues"
289
+ $ref: "#/definitions/base_groups_child_stream"
290
+ primary_key: "iid"
291
+ transformations:
292
+ - type: AddFields
293
+ fields:
294
+ - type: AddedFieldDefinition
295
+ path: ["milestone_id"]
296
+ value: "{{ (record.get('milestone') or {}).get('id') }}"
297
+ - type: AddedFieldDefinition
298
+ path: ["assignee_id"]
299
+ value: "{{ (record.get('assignee') or {}).get('id') }}"
300
+ - type: AddedFieldDefinition
301
+ path: ["author_id"]
302
+ value: "{{ (record.get('author') or {}).get('id') }}"
303
+ - type: AddedFieldDefinition
304
+ path: ["assignees"]
305
+ value: |
306
+ {% set ids = [] %}
307
+ {% for data in (record.get('assignees') or []) %}
308
+ {% set _ = ids.append(data.get('id')) %}
309
+ {% endfor %}
310
+ {{ ids }}
311
+ retriever:
312
+ $ref: "#/definitions/retriever"
313
+ partition_router:
314
+ type: SubstreamPartitionRouter
315
+ parent_stream_configs:
316
+ - type: ParentStreamConfig
317
+ parent_key: "iid"
318
+ stream: "#/definitions/epics_stream"
319
+ partition_field: "iid"
320
+ $parameters:
321
+ path: "groups/{{ stream_slice.parent_slice.id }}/epics/{{ stream_slice.iid }}/issues"
322
+
323
+ ## Projects-based streams
324
+ projects_stream:
325
+ name: "projects"
326
+ $ref: "#/definitions/base_full_refresh_stream"
327
+ retriever: "#/definitions/projects_streams_retriever"
328
+ $parameters:
329
+ path: "projects/{{ stream_slice.id }}"
330
+ request_parameters:
331
+ statistics: 1
332
+
333
+ project_milestones_stream:
334
+ name: "project_milestones"
335
+ $ref: "#/definitions/base_projects_child_stream"
336
+ $parameters:
337
+ path: "projects/{{ stream_slice.id }}/milestones"
338
+
339
+ project_members_stream:
340
+ name: "project_members"
341
+ $ref: "#/definitions/base_projects_child_stream"
342
+ primary_key: ["project_id", "id"]
343
+ transformations:
344
+ - "#/definitions/add_project_id_field"
345
+ $parameters:
346
+ path: "projects/{{ stream_slice.id }}/members"
347
+
348
+ project_labels_stream:
349
+ name: "project_labels"
350
+ $ref: "#/definitions/base_projects_child_stream"
351
+ primary_key: ["project_id", "id"]
352
+ transformations:
353
+ - "#/definitions/add_project_id_field"
354
+ $parameters:
355
+ path: "projects/{{ stream_slice.id }}/labels"
356
+
357
+ branches_stream:
358
+ name: "branches"
359
+ $ref: "#/definitions/base_projects_child_stream"
360
+ transformations:
361
+ - "#/definitions/add_project_id_field"
362
+ - type: AddFields
363
+ fields:
364
+ - type: AddedFieldDefinition
365
+ path: ["commit_id"]
366
+ value: "{{ (record.get('commit') or {}).get('id') }}"
367
+ primary_key: ["project_id", "name"]
368
+ $parameters:
369
+ path: "projects/{{ stream_slice.id }}/repository/branches"
370
+
371
+ releases_stream:
372
+ name: "releases"
373
+ $ref: "#/definitions/base_projects_child_stream"
374
+ primary_key: "name"
375
+ transformations:
376
+ - "#/definitions/add_project_id_field"
377
+ - type: AddFields
378
+ fields:
379
+ - type: AddedFieldDefinition
380
+ path: ["author_id"]
381
+ value: "{{ (record.get('author') or {}).get('id') }}"
382
+ - type: AddedFieldDefinition
383
+ path: ["commit_id"]
384
+ value: "{{ (record.get('commit') or {}).get('id') }}"
385
+ - type: AddedFieldDefinition
386
+ path: ["milestones"]
387
+ value: |
388
+ {% set ids = [] %}
389
+ {% for data in record.get('milestones', []) %}
390
+ {% set _ = ids.append(data.get('id')) %}
391
+ {% endfor %}
392
+ {{ ids }}
393
+ $parameters:
394
+ path: "projects/{{ stream_slice.id }}/releases"
395
+
396
+ tags_stream:
397
+ name: "tags"
398
+ $ref: "#/definitions/base_projects_child_stream"
399
+ primary_key: ["project_id", "name"]
400
+ transformations:
401
+ - "#/definitions/add_project_id_field"
402
+ - type: AddFields
403
+ fields:
404
+ - type: AddedFieldDefinition
405
+ path: ["commit_id"]
406
+ value: "{{ (record.get('commit') or {}).get('id') }}"
407
+ $parameters:
408
+ path: "projects/{{ stream_slice.id }}/repository/tags"
409
+
410
+ users_stream:
411
+ name: "users"
412
+ $ref: "#/definitions/base_projects_child_stream"
413
+ primary_key: "name"
414
+ $parameters:
415
+ path: "projects/{{ stream_slice.id }}/users"
416
+
417
+ deployments_stream:
418
+ name: "deployments"
419
+ $ref: "#/definitions/base_projects_child_stream"
420
+ transformations:
421
+ - "#/definitions/add_project_id_field"
422
+ - type: AddFields
423
+ fields:
424
+ - type: AddedFieldDefinition
425
+ path: ["user_username"]
426
+ value: "{{ (record.get('user') or {}).get('username') }}"
427
+ - type: AddedFieldDefinition
428
+ path: ["user_full_name"]
429
+ value: "{{ (record.get('user') or {}).get('name') }}"
430
+ - type: AddedFieldDefinition
431
+ path: ["environment_name"]
432
+ value: "{{ (record.get('environment') or {}).get('name') }}"
433
+ - type: AddedFieldDefinition
434
+ path: ["user_id"]
435
+ value: "{{ (record.get('user') or {}).get('id') }}"
436
+ - type: AddedFieldDefinition
437
+ path: ["environment_id"]
438
+ value: "{{ (record.get('environment') or {}).get('id') }}"
439
+ $parameters:
440
+ path: "projects/{{ stream_slice.id }}/deployments"
441
+
442
+ merge_request_commits_stream:
443
+ name: "merge_request_commits"
444
+ $ref: "#/definitions/base_projects_child_stream"
445
+ retriever:
446
+ $ref: "#/definitions/retriever"
447
+ partition_router:
448
+ type: SubstreamPartitionRouter
449
+ parent_stream_configs:
450
+ - type: ParentStreamConfig
451
+ parent_key: "iid"
452
+ stream: "#/definitions/merge_requests_stream"
453
+ partition_field: "iid"
454
+ transformations:
455
+ - type: AddFields
456
+ fields:
457
+ - type: AddedFieldDefinition
458
+ path: ["project_id"]
459
+ value: "{{ stream_slice.parent_slice.id }}"
460
+ - type: AddedFieldDefinition
461
+ path: ["merge_request_iid"]
462
+ value: "{{ stream_slice.iid }}"
463
+ $parameters:
464
+ path: "projects/{{ stream_slice.parent_slice.id }}/merge_requests/{{ stream_slice.iid }}/commits"
465
+
466
+ pipelines_extended_stream:
467
+ name: "pipelines_extended"
468
+ $ref: "#/definitions/base_projects_child_stream"
469
+ retriever: "#/definitions/pipelines_child_streams_retriever"
470
+ $parameters:
471
+ path: "projects/{{ stream_slice.parent_slice.id }}/pipelines/{{ stream_slice.id }}"
472
+
473
+ jobs_stream:
474
+ name: "jobs"
475
+ $ref: "#/definitions/base_projects_child_stream"
476
+ retriever: "#/definitions/pipelines_child_streams_retriever"
477
+ transformations:
478
+ - type: AddFields
479
+ fields:
480
+ - type: AddedFieldDefinition
481
+ path: ["project_id"]
482
+ value: "{{ stream_slice.parent_slice.id }}"
483
+ - type: AddedFieldDefinition
484
+ path: ["user_id"]
485
+ value: "{{ (record.get('user') or {}).get('id') }}"
486
+ - type: AddedFieldDefinition
487
+ path: ["pipeline_id"]
488
+ value: "{{ (record.get('pipeline') or {}).get('id') }}"
489
+ - type: AddedFieldDefinition
490
+ path: ["runner_id"]
491
+ value: "{{ (record.get('runner') or {}).get('id') }}"
492
+ - type: AddedFieldDefinition
493
+ path: ["commit_id"]
494
+ value: "{{ (record.get('commit') or {}).get('id') }}"
495
+ $parameters:
496
+ path: "projects/{{ stream_slice.parent_slice.id }}/pipelines/{{ stream_slice.id }}/jobs"
497
+
498
+ # Incremental streams
499
+ commits_stream:
500
+ name: "commits"
501
+ $ref: "#/definitions/base_projects_incremental_child_stream"
502
+ transformations:
503
+ - "#/definitions/add_project_id_field"
504
+ $parameters:
505
+ path: "projects/{{ stream_slice.id }}/repository/commits"
506
+ cursor_field: "created_at"
507
+ lower_bound_filter: "since"
508
+ upper_bound_filter: "until"
509
+ request_parameters:
510
+ with_stats: "true"
511
+
512
+ issues_stream:
513
+ name: "issues"
514
+ $ref: "#/definitions/base_projects_incremental_child_stream"
515
+ transformations:
516
+ - type: AddFields
517
+ fields:
518
+ - type: AddedFieldDefinition
519
+ path: ["author_id"]
520
+ value: "{{ (record.get('author') or {}).get('id') }}"
521
+ - type: AddedFieldDefinition
522
+ path: ["assignee_id"]
523
+ value: "{{ (record.get('assignee') or {}).get('id') }}"
524
+ - type: AddedFieldDefinition
525
+ path: ["closed_by_id"]
526
+ value: "{{ (record.get('closed_by') or {}).get('id') }}"
527
+ - type: AddedFieldDefinition
528
+ path: ["milestone_id"]
529
+ value: "{{ (record.get('milestone') or {}).get('id') }}"
530
+ - type: AddedFieldDefinition
531
+ path: ["assignees"]
532
+ value: |
533
+ {% set ids = [] %}
534
+ {% for data in record.get('assignees', []) %}
535
+ {% set _ = ids.append(data.get('id')) %}
536
+ {% endfor %}
537
+ {{ ids }}
538
+ $parameters:
539
+ path: "projects/{{ stream_slice.id }}/issues"
540
+ request_parameters:
541
+ scope: "all"
542
+
543
+ merge_requests_stream:
544
+ name: "merge_requests"
545
+ $ref: "#/definitions/base_projects_incremental_child_stream"
546
+ transformations:
547
+ - type: AddFields
548
+ fields:
549
+ - type: AddedFieldDefinition
550
+ path: ["author_id"]
551
+ value: "{{ (record.get('author') or {}).get('id') }}"
552
+ - type: AddedFieldDefinition
553
+ path: ["assignee_id"]
554
+ value: "{{ (record.get('assignee') or {}).get('id') }}"
555
+ - type: AddedFieldDefinition
556
+ path: ["closed_by_id"]
557
+ value: "{{ (record.get('closed_by') or {}).get('id') }}"
558
+ - type: AddedFieldDefinition
559
+ path: ["milestone_id"]
560
+ value: "{{ (record.get('milestone') or {}).get('id') }}"
561
+ - type: AddedFieldDefinition
562
+ path: ["merged_by_id"]
563
+ value: "{{ (record.get('merged_by') or {}).get('id') }}"
564
+ - type: AddedFieldDefinition
565
+ path: ["assignees"]
566
+ value: |
567
+ {% set ids = [] %}
568
+ {% for data in record.get('assignees', []) %}
569
+ {% set _ = ids.append(data.get('id')) %}
570
+ {% endfor %}
571
+ {{ ids }}
572
+ $parameters:
573
+ path: "projects/{{ stream_slice.id }}/merge_requests"
574
+ request_parameters:
575
+ scope: "all"
576
+
577
+ pipelines_stream:
578
+ name: "pipelines"
579
+ $ref: "#/definitions/base_projects_incremental_child_stream"
580
+ $parameters:
581
+ path: "projects/{{ stream_slice.id }}/pipelines"
582
+
583
+ streams:
584
+ # Groups-based streams
585
+ - "#/definitions/groups_stream"
586
+ - "#/definitions/group_milestones_stream"
587
+ - "#/definitions/group_members_stream"
588
+ - "#/definitions/group_labels_stream"
589
+ - "#/definitions/group_issue_boards_stream"
590
+ - "#/definitions/epics_stream"
591
+ - "#/definitions/epic_issues_stream"
592
+
593
+ # Projects-based streams
594
+ - "#/definitions/projects_stream"
595
+ - "#/definitions/project_milestones_stream"
596
+ - "#/definitions/project_members_stream"
597
+ - "#/definitions/project_labels_stream"
598
+ - "#/definitions/branches_stream"
599
+ - "#/definitions/releases_stream"
600
+ - "#/definitions/tags_stream"
601
+ - "#/definitions/users_stream"
602
+ - "#/definitions/deployments_stream"
603
+ - "#/definitions/commits_stream"
604
+ - "#/definitions/issues_stream"
605
+ - "#/definitions/merge_requests_stream"
606
+ - "#/definitions/merge_request_commits_stream"
607
+ - "#/definitions/pipelines_stream"
608
+ - "#/definitions/pipelines_extended_stream"
609
+ - "#/definitions/jobs_stream"
610
+
611
+ check:
612
+ type: CheckStream
613
+ stream_names:
614
+ - projects