airbyte-internal-ops 0.4.2__py3-none-any.whl → 0.5.1__py3-none-any.whl

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 (130) hide show
  1. {airbyte_internal_ops-0.4.2.dist-info → airbyte_internal_ops-0.5.1.dist-info}/METADATA +2 -1
  2. {airbyte_internal_ops-0.4.2.dist-info → airbyte_internal_ops-0.5.1.dist-info}/RECORD +21 -129
  3. airbyte_ops_mcp/cli/cloud.py +31 -2
  4. airbyte_ops_mcp/cloud_admin/api_client.py +506 -33
  5. airbyte_ops_mcp/cloud_admin/models.py +56 -0
  6. airbyte_ops_mcp/constants.py +58 -0
  7. airbyte_ops_mcp/{_legacy/airbyte_ci/metadata_service/docker_hub.py → docker_hub.py} +16 -10
  8. airbyte_ops_mcp/mcp/cloud_connector_versions.py +491 -10
  9. airbyte_ops_mcp/mcp/prerelease.py +5 -44
  10. airbyte_ops_mcp/mcp/prod_db_queries.py +128 -4
  11. airbyte_ops_mcp/mcp/regression_tests.py +10 -5
  12. airbyte_ops_mcp/{_legacy/airbyte_ci/metadata_service/validators/metadata_validator.py → metadata_validator.py} +18 -12
  13. airbyte_ops_mcp/prod_db_access/queries.py +51 -0
  14. airbyte_ops_mcp/prod_db_access/sql.py +76 -0
  15. airbyte_ops_mcp/regression_tests/ci_output.py +8 -4
  16. airbyte_ops_mcp/regression_tests/connection_fetcher.py +16 -5
  17. airbyte_ops_mcp/regression_tests/http_metrics.py +21 -2
  18. airbyte_ops_mcp/regression_tests/models.py +7 -1
  19. airbyte_ops_mcp/telemetry.py +162 -0
  20. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/.gitignore +0 -1
  21. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/README.md +0 -420
  22. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/__init__.py +0 -2
  23. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/__init__.py +0 -1
  24. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/backends/__init__.py +0 -8
  25. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/backends/base_backend.py +0 -16
  26. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/backends/duckdb_backend.py +0 -87
  27. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/backends/file_backend.py +0 -165
  28. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/connection_objects_retrieval.py +0 -377
  29. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/connector_runner.py +0 -247
  30. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/errors.py +0 -7
  31. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/evaluation_modes.py +0 -25
  32. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/hacks.py +0 -23
  33. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/json_schema_helper.py +0 -384
  34. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/mitm_addons.py +0 -37
  35. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/models.py +0 -595
  36. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/proxy.py +0 -207
  37. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/secret_access.py +0 -47
  38. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/segment_tracking.py +0 -45
  39. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/utils.py +0 -214
  40. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/conftest.py.disabled +0 -751
  41. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/consts.py +0 -4
  42. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/poetry.lock +0 -4480
  43. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/pytest.ini +0 -9
  44. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/regression_tests/__init__.py +0 -1
  45. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/regression_tests/test_check.py +0 -61
  46. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/regression_tests/test_discover.py +0 -117
  47. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/regression_tests/test_read.py +0 -627
  48. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/regression_tests/test_spec.py +0 -43
  49. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/report.py +0 -542
  50. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/stash_keys.py +0 -38
  51. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/templates/__init__.py +0 -0
  52. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/templates/private_details.html.j2 +0 -305
  53. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/templates/report.html.j2 +0 -515
  54. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/utils.py +0 -187
  55. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/validation_tests/__init__.py +0 -0
  56. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/validation_tests/test_check.py +0 -61
  57. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/validation_tests/test_discover.py +0 -217
  58. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/validation_tests/test_read.py +0 -177
  59. airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/validation_tests/test_spec.py +0 -631
  60. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/README.md +0 -91
  61. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/bin/bundle-schemas.js +0 -48
  62. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/bin/generate-metadata-models.sh +0 -36
  63. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ActorDefinitionResourceRequirements.py +0 -54
  64. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/AirbyteInternal.py +0 -22
  65. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/AllowedHosts.py +0 -18
  66. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorBreakingChanges.py +0 -65
  67. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorBuildOptions.py +0 -15
  68. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorIPCOptions.py +0 -25
  69. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorMetadataDefinitionV0.json +0 -897
  70. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorMetadataDefinitionV0.py +0 -478
  71. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorMetrics.py +0 -24
  72. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorPackageInfo.py +0 -12
  73. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorRegistryDestinationDefinition.py +0 -407
  74. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorRegistryReleases.py +0 -406
  75. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorRegistrySourceDefinition.py +0 -407
  76. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorRegistryV0.py +0 -413
  77. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorReleases.py +0 -98
  78. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ConnectorTestSuiteOptions.py +0 -58
  79. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/GeneratedFields.py +0 -62
  80. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/GitInfo.py +0 -31
  81. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/JobType.py +0 -23
  82. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/NormalizationDestinationDefinitionConfig.py +0 -24
  83. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/RegistryOverrides.py +0 -111
  84. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ReleaseStage.py +0 -15
  85. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/RemoteRegistries.py +0 -23
  86. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/ResourceRequirements.py +0 -18
  87. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/RolloutConfiguration.py +0 -29
  88. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/Secret.py +0 -34
  89. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/SecretStore.py +0 -22
  90. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/SourceFileInfo.py +0 -16
  91. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/SuggestedStreams.py +0 -18
  92. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/SupportLevel.py +0 -15
  93. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/TestConnections.py +0 -14
  94. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/__init__.py +0 -31
  95. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/generated/airbyte-connector-metadata-schema.json +0 -0
  96. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ActorDefinitionResourceRequirements.yaml +0 -30
  97. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/AirbyteInternal.yaml +0 -32
  98. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/AllowedHosts.yaml +0 -13
  99. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ConnectorBreakingChanges.yaml +0 -65
  100. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ConnectorBuildOptions.yaml +0 -10
  101. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ConnectorIPCOptions.yaml +0 -29
  102. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ConnectorMetadataDefinitionV0.yaml +0 -172
  103. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ConnectorMetrics.yaml +0 -30
  104. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ConnectorPackageInfo.yaml +0 -9
  105. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ConnectorRegistryDestinationDefinition.yaml +0 -90
  106. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ConnectorRegistryReleases.yaml +0 -35
  107. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ConnectorRegistrySourceDefinition.yaml +0 -92
  108. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ConnectorRegistryV0.yaml +0 -18
  109. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ConnectorReleases.yaml +0 -16
  110. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ConnectorTestSuiteOptions.yaml +0 -28
  111. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/GeneratedFields.yaml +0 -16
  112. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/GitInfo.yaml +0 -21
  113. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/JobType.yaml +0 -14
  114. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/NormalizationDestinationDefinitionConfig.yaml +0 -21
  115. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/RegistryOverrides.yaml +0 -38
  116. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ReleaseStage.yaml +0 -11
  117. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/RemoteRegistries.yaml +0 -25
  118. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/ResourceRequirements.yaml +0 -16
  119. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/RolloutConfiguration.yaml +0 -29
  120. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/Secret.yaml +0 -19
  121. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/SecretStore.yaml +0 -16
  122. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/SourceFileInfo.yaml +0 -17
  123. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/SuggestedStreams.yaml +0 -13
  124. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/SupportLevel.yaml +0 -10
  125. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/models/TestConnections.yaml +0 -17
  126. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/package-lock.json +0 -62
  127. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/package.json +0 -12
  128. airbyte_ops_mcp/_legacy/airbyte_ci/metadata_models/transform.py +0 -71
  129. {airbyte_internal_ops-0.4.2.dist-info → airbyte_internal_ops-0.5.1.dist-info}/WHEEL +0 -0
  130. {airbyte_internal_ops-0.4.2.dist-info → airbyte_internal_ops-0.5.1.dist-info}/entry_points.txt +0 -0
@@ -1,515 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Test Report</title>
7
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/tokyo-night-dark.min.css">
8
- <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
9
-
10
- <script>
11
- hljs.highlightAll();
12
- function copyToClipboard(elementId) {
13
- var toCopy = document.getElementById(elementId).innerText;
14
- navigator.clipboard.writeText(toCopy);
15
- }
16
- function refreshPage() {
17
- {% if not fully_generated %}
18
- window.location.reload();
19
- {% else %}
20
- console.log("Report is fully generated");
21
- {% endif %}
22
- }
23
- function toggleContent(element) {
24
- const contentDiv = element.querySelector('.section_content');
25
- if (contentDiv.style.display === "none") {
26
- contentDiv.style.display = "block";
27
- element.classList.add('active');
28
- } else {
29
- contentDiv.style.display = "none";
30
- element.classList.remove('active');
31
- }
32
- }
33
- setInterval(refreshPage, 10000);
34
- </script>
35
- <style>
36
- body {
37
- font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
38
- background-color: #0d1117;
39
- color: #c9d1d9;
40
- padding: 16px;
41
- font-size: 14px;
42
- }
43
-
44
- a {
45
- color: #4493f8;
46
- text-decoration: underline;
47
- text-underline-offset: .2rem;
48
- }
49
-
50
- button {
51
- border: 1px solid #30363d;
52
- background-color: #1a1c26;
53
- padding: 5px;
54
- cursor: pointer;
55
- opacity: 0.7;
56
- border-radius: 5px;
57
- transition: opacity 0.5s;
58
- }
59
-
60
- button:hover {
61
- opacity: 1;
62
- }
63
-
64
- section {
65
- margin-bottom: 30px;
66
- border: 1px solid #30363d;
67
- border-radius: 6px;
68
- }
69
-
70
- h1 {
71
- font-optical-sizing: auto;
72
- font-weight: 600;
73
- font-size: 2rem;
74
- }
75
-
76
- h2 {
77
- font-size: 1.5rem;
78
- font-optical-sizing: auto;
79
- font-weight: 600;
80
- margin: 0;
81
- display: block;
82
- background-color: #161b22;
83
- padding-left: 15px;
84
- padding-top: 10px;
85
- padding-bottom: 10px;
86
- border-bottom: 1px solid #30363d;
87
- }
88
-
89
- h3 {
90
- font-size: 1.25rem;
91
- font-optical-sizing: auto;
92
- font-weight: 600;
93
- margin: 0;
94
- margin-top: 15px;
95
- margin-bottom: 15px;
96
- }
97
-
98
- h4 {
99
- font-size: 1rem;
100
- font-optical-sizing: auto;
101
- font-weight: 600;
102
- margin: 0;
103
- margin-top: 15px;
104
- }
105
-
106
- ul {
107
- list-style: none;
108
- padding: 0;
109
- }
110
-
111
- li {
112
- margin-bottom: 15px;
113
- }
114
-
115
- table {
116
- border-collapse: collapse;
117
- margin-top: 15px;
118
- width: 100%;
119
- }
120
-
121
- th, td {
122
- border: 1px solid #30363d;
123
- padding: 8px;
124
- text-align: left;
125
- min-width: 15px;
126
- max-width: 400px;
127
- overflow-x: auto;
128
- scrollbar-color: hotpink #0d1116;
129
- }
130
-
131
- th {
132
- text-align: center;
133
- }
134
-
135
- code {
136
- border: 1px solid #30363d;
137
- border-radius: 6px;
138
- max-height: 500px;
139
- scrollbar-color: hotpink #1a1b26;
140
- white-space: pre-wrap;
141
- }
142
-
143
- .monospace {
144
- font-family: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;
145
- margin: 0;
146
- font-size: 85%;
147
- color: #fff;
148
- }
149
-
150
- .test-name {
151
- font-family: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;
152
- font-size: 1.15rem
153
- }
154
-
155
- .metric {
156
- text-align: center;
157
- }
158
-
159
- .highlighted {
160
- background-color: #212c36;
161
- }
162
-
163
- .container {
164
- max-width: 1280px;
165
- margin-right: auto;
166
- margin-left: auto;
167
- }
168
-
169
- .section_content {
170
- padding: 15px;
171
- }
172
-
173
- .no-border {
174
- border: none;
175
- }
176
-
177
- .full-width {
178
- width: 100%;
179
- }
180
-
181
- .test-result {
182
- margin-top: 15px;
183
- border-bottom: 1px solid #30363d;
184
- }
185
-
186
- .loader {
187
- width: 20px;
188
- height: 20px;
189
- border: 2px solid #FFF;
190
- border-radius: 50%;
191
- display: inline-block;
192
- position: relative;
193
- box-sizing: border-box;
194
- animation: rotation 1s linear infinite;
195
- margin-right: 10px;
196
- }
197
-
198
- .loader::after,
199
- .loader::before {
200
- content: '';
201
- box-sizing: border-box;
202
- position: absolute;
203
- left: 0;
204
- top: 0;
205
- background: #FF3D00;
206
- width: 6px;
207
- height: 6px;
208
- transform: translate(150%, 150%);
209
- border-radius: 50%;
210
- }
211
-
212
- .loader::before {
213
- left: auto;
214
- top: auto;
215
- right: 0;
216
- bottom: 0;
217
- transform: translate(-150%, -150%);
218
- }
219
-
220
- .clipped {
221
- max-height: 500px;
222
- overflow-y: auto;
223
- scrollbar-color: hotpink #0d1116;
224
- }
225
-
226
- .testDescription {
227
- color: #9c9c9c;
228
- }
229
- .collapsible {
230
- cursor: pointer;
231
- position: relative;
232
- }
233
- .collapsible::before {
234
- content: '▼'; /* Down arrow */
235
- position: absolute;
236
- right: 10px;
237
- top: 13px;
238
- transform: rotate(-90deg); /* Rotate arrow to the right */
239
- transition: transform 0.3s;
240
- font-size: 1rem;
241
-
242
- }
243
- .collapsible.active::before {
244
- transform: rotate(0deg); /* Rotate arrow to the right */
245
- }
246
- .secondaryButton {
247
- font-size: 0.75rem;
248
- padding: 2px 10px;
249
- }
250
-
251
- @keyframes rotation {
252
- 0% {
253
- transform: rotate(0deg);
254
- }
255
- 100% {
256
- transform: rotate(360deg);
257
- }
258
- }
259
- </style>
260
- </head>
261
- <body>
262
- <div class="container">
263
- <h1 style="text-align: center;">Regression test report</h1>
264
- <section>
265
- <h2>Context</h2>
266
- <div class="section_content">
267
- <ul>
268
- <li>Tester: <span class="monospace">{{ user }}</span></li>
269
- <li>Test date: <span class="monospace">{{ test_date }}</span></li>
270
- <li>Connector image: <span class="monospace">{{ connector_image }}</span></li>
271
- <li>Control version: <span class="monospace">{{ control_version }}</span></li>
272
- <li>Target version: <span class="monospace">{{ target_version }}</span></li>
273
- <li><a href="{{ private_details_url}}" target="_blank">Private details</a></li>
274
- </ul>
275
- </div>
276
- </section>
277
- <section>
278
- <h2>Coverage metadata</h2>
279
- <div class="section_content">
280
- <h3>Stream coverage</h3>
281
- <table>
282
- <tbody>
283
- <tr>
284
- {% for metric_name, metric_value in stream_coverage_metrics.items() %}
285
- <td>{{ metric_name}}</td>
286
- <td class="monospace metric highlighted">{{ metric_value }}</td>
287
- {% endfor %}
288
- </tr>
289
- </tbody>
290
- </table>
291
- <h3>Sync mode coverage</h3>
292
- <table>
293
- <tbody>
294
- <tr>
295
- {% for sync_mode, count in sync_mode_coverage.items() %}
296
- <td class="monospace">{{ sync_mode.value }}</td>
297
- <td class="monospace metric highlighted">{{ count }}</td>
298
- {% endfor %}
299
- </tr>
300
- </tbody>
301
- </table>
302
-
303
- <h3>Selected stream</h3>
304
- <table>
305
- <thead>
306
- <tr>
307
- <th>Stream</th>
308
- <th>Sync mode</th>
309
- <th>Has data</th>
310
- </tr>
311
- <tbody>
312
- {% for stream_name in selected_streams %}
313
- <tr>
314
- <td>{{ stream_name }}</td>
315
- <td class="monospace">{{ selected_streams[stream_name]['sync_mode'].value }}</td>
316
- {% if selected_streams[stream_name]['has_data'] %}
317
- <td class="monospace">{{ selected_streams[stream_name]['has_data'] }}</td>
318
- {% else %}
319
- <td class="monospace" style="color: red;">{{ selected_streams[stream_name]['has_data'] }}</td>
320
- {% endif %}
321
- </tr>
322
- {% endfor %}
323
- </tbody>
324
- </table>
325
- {% if untested_streams %}
326
- <h3>Untested streams (not in configured catalog or without data)</h3>
327
- <ul>
328
- {% for stream_name in untested_streams %}
329
- <li>{{ stream_name }}</li>
330
- {% endfor %}
331
- </ul>
332
- {% endif %}
333
- </div>
334
- </section>
335
- {% for connection_objects in all_connection_objects %}
336
-
337
- <section class="collapsible" onclick="toggleContent(this)">
338
- <h2>Connection objects - Connection {{ connection_objects.hashed_connection_id }} </h2>
339
- <div class="section_content" style="display: none">
340
- <p class="testDescription">Each object below relates to an "argument" passed to one (or many) of the Connectors standard commands (spec/check/discover/read). The source of these arguments is either the connector itself (catalog), the connection (config/state) or both (configured catalog). To learn more checkout the <a href="https://docs.airbyte.com/understanding-airbyte/airbyte-protocol" target="_blank">Airbyte Protocol Documentation</a></p>
341
- {% if connection_objects['state'] %}
342
- <h3>State <button class="monospace secondaryButton" onclick="copyToClipboard('state')">📋 copy</button></h3>
343
- <p class="testDescription">The state object taken from the given connection that was passed to each version of the connector during the test.</p>
344
- <pre><code class="language-json" id="state">{{ connection_objects['state'] }}</code>
345
- </pre>
346
- {% endif %}
347
- <h3>Configured catalog <button class="monospace secondaryButton" onclick="copyToClipboard('configured-catalog')">📋 copy</button></h3>
348
- <p class="testDescription">The configured catalog object taken returned by the connector given the connection config.</p>
349
- <pre><code class="language-json" id="configured-catalog">{{ connection_objects['configured_catalog'] }}</code></pre>
350
- <h3>Catalog <button class="monospace secondaryButton" onclick="copyToClipboard('catalog')">📋 copy</button></h3>
351
- <p class="testDescription">The catalog object returned by the connector.</p>
352
- <pre><code class="language-json" id="catalog">{{ connection_objects['catalog'] }}</code></pre>
353
- </div>
354
- </section>
355
- {% endfor %}
356
-
357
- <section>
358
- {% if not fully_generated %}
359
- <h2><span class="loader"></span>Command execution metrics</h2>
360
- {% else%}
361
- <h2>Command execution metrics</h2>
362
- {% endif %}
363
- <div class="section_content">
364
- {% if message_count_per_type[0] %}
365
- <h3>Message types</h3>
366
- <table>
367
- <thead>
368
- <tr>
369
- <th class="no-border"></th>
370
- {% for command in message_count_per_type[0] %}
371
- <th colspan=3 class="monospace">{{ command.value.upper() }}</th>
372
- {% endfor %}
373
- </tr>
374
- <tr>
375
- <th class="no-border"></th>
376
- {% for command in message_count_per_type[0] %}
377
- <th>control</th>
378
- <th>target</th>
379
- <th>Δ</th>
380
- {% endfor %}
381
- </thead>
382
- {% for message_type in message_count_per_type[1] %}
383
- <tr>
384
- <td class="monospace">{{ message_type.value }}</td>
385
- {% for command in message_count_per_type[1][message_type] %}
386
- <td class="monospace metric">{{ message_count_per_type[1][message_type][command]["control"] }}</td>
387
- <td class="monospace metric">{{ message_count_per_type[1][message_type][command]["target"] }}</td>
388
- {% if message_count_per_type[1][message_type][command]["difference"] != 0 %}
389
- <td class="monospace metric highlighted">{{ message_count_per_type[1][message_type][command]["difference"] }}</td>
390
- {% else %}
391
- <td class="monospace metric">{{ message_count_per_type[1][message_type][command]["difference"] }}</td>
392
- {% endif %}
393
- {% endfor %}
394
- </tr>
395
- {% endfor %}
396
- </table>
397
- {% endif %}
398
- {% if record_count_per_command_and_stream %}
399
- <h3>Record count per stream</h3>
400
- {% for command, record_count_per_stream in record_count_per_command_and_stream.items() %}
401
- <h4>{{ command.value.upper() }}</h4>
402
- <table>
403
- <thead>
404
- <tr>
405
- <th>stream</th>
406
- <th>control record count</th>
407
- <th>target record count</th>
408
- <th>Δ</th>
409
- </tr>
410
- </thead>
411
- <tbody>
412
- {% for stream, record_count in record_count_per_stream.items() %}
413
- <tr>
414
- <td class="monospace">{{ stream }}</td>
415
- <td class="monospace metric">{{ record_count.get("control", 0) }}</td>
416
- <td class="monospace metric">{{ record_count.get("target", 0) }}</td>
417
- {% if record_count.get("difference", 0) != 0 %}
418
- <td class="monospace metric highlighted">{{ record_count.get("difference", 0) }}</td>
419
- {% else %}
420
- <td class="monospace metric">{{ record_count.get("difference", 0) }}</td>
421
- {% endif %}
422
- </tr>
423
- {% endfor %}
424
- </tbody>
425
- </table>
426
- {% endfor %}
427
- {% endif %}
428
- {% if http_metrics_per_command %}
429
- <h3>HTTP traffic</h3>
430
- <table>
431
- <thead>
432
- <tr>
433
- <th class="no-border"></th>
434
- <th colspan="2">control</th>
435
- <th colspan="3">target</th>
436
- <th>Δ</th>
437
- </tr>
438
- <tr>
439
- <th>command</th>
440
- <th>request count</th>
441
- <th>duplicate request count</th>
442
- <th>request count</th>
443
- <th>duplicate request count</th>
444
- <th>cache hit ratio</th>
445
- <th>request count</th>
446
- </tr>
447
- <tbody>
448
- {% for command in http_metrics_per_command %}
449
- <tr>
450
- <td class="monospace">{{ command.value.upper() }}</td>
451
- <td class="monospace metric">{{ http_metrics_per_command[command].get("control", {}).get("flow_count", "0")}}</td>
452
- <td class="monospace metric">{{ http_metrics_per_command[command].get("control", {}).get("duplicate_flow_count", "0")}}</td>
453
- <td class="monospace metric">{{ http_metrics_per_command[command].get("target", {}).get("flow_count", "0")}}</td>
454
- <td class="monospace metric">{{ http_metrics_per_command[command].get("target", {}).get("duplicate_flow_count", "0")}}</td>
455
- <td class="monospace metric">{{ http_metrics_per_command[command].get("target", {}).get("cache_hit_ratio", "0%")}}</td>
456
- {% if http_metrics_per_command[command].get("difference", 0) != 0 %}
457
- <td class="monospace metric highlighted">{{ http_metrics_per_command[command].get("difference", 0)}}</td>
458
- {% else %}
459
- <td class="monospace metric">{{ http_metrics_per_command[command].get("difference", 0)}}</td>
460
- {% endif %}
461
- </tr>
462
- {% endfor %}
463
- </tbody>
464
- </table>
465
- {% endif %}
466
- </div>
467
- </section>
468
-
469
- <section>
470
- {% if not fully_generated %}
471
- <h2><span class="loader"></span>Test results</h2>
472
- {% else%}
473
- <h2>Test results</h2>
474
- {% endif %}
475
- <div class="section_content">
476
- {% for test in test_results %}
477
- <div class="test-result">
478
- {% if test["result"] == "passed" %}
479
- {% if test["output"] %}
480
- <h3 class="test-name" style="color: yellow;">{{ test["name"] }} [{{ test["result"] + " with errors" }}]</h3>
481
- {% else %}
482
- <h3 class="test-name" style="color: #7ee787;">{{ test["name"] }} [{{ test["result"] }}]</h3>
483
- {% endif %}
484
- {% elif test["result"] == "failed" %}
485
- <h3 class="test-name" style="color: crimson;">{{ test["name"] }} [{{ test["result"] }}]</h3>
486
- {% else %}
487
- <h3 class="test-name" style="color: #fddf68;">{{ test["name"] }} [{{ test["result"] }}]</h3>
488
- {% endif %}
489
- {% if test["documentation"] %}
490
- <p class="testDescription">{{ test["documentation"] }}</p>
491
- {% endif %}
492
- {% if test["output"] %}
493
- <pre>
494
- <code class="language-python">{{ test["output"] }}</code>
495
- </pre>
496
- {% endif %}
497
- {% if test["properties"]%}
498
- {% for property_name, property_value in test["properties"] %}
499
- {% if property_value %}
500
- <h4>{{ property_name }}</h4>
501
- <pre>
502
- <code class="language-json">{{ property_value }}</code>
503
- </pre>
504
- {% else%}
505
- <!-- Do not display empty properties -->
506
- {% endif %}
507
- {% endfor%}
508
- {% endif %}
509
- </div>
510
- {% endfor%}
511
- </div>
512
- </section>
513
- </div>
514
- </body>
515
- </html>