airbyte-internal-ops 0.4.2__py3-none-any.whl → 0.5.0__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.
- {airbyte_internal_ops-0.4.2.dist-info → airbyte_internal_ops-0.5.0.dist-info}/METADATA +1 -1
- {airbyte_internal_ops-0.4.2.dist-info → airbyte_internal_ops-0.5.0.dist-info}/RECORD +13 -52
- airbyte_ops_mcp/cli/cloud.py +27 -0
- airbyte_ops_mcp/cloud_admin/api_client.py +473 -0
- airbyte_ops_mcp/cloud_admin/models.py +56 -0
- airbyte_ops_mcp/mcp/cloud_connector_versions.py +460 -0
- airbyte_ops_mcp/mcp/prerelease.py +5 -44
- airbyte_ops_mcp/regression_tests/ci_output.py +8 -4
- airbyte_ops_mcp/regression_tests/http_metrics.py +21 -2
- airbyte_ops_mcp/regression_tests/models.py +6 -0
- airbyte_ops_mcp/telemetry.py +162 -0
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/.gitignore +0 -1
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/README.md +0 -420
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/__init__.py +0 -2
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/__init__.py +0 -1
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/backends/__init__.py +0 -8
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/backends/base_backend.py +0 -16
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/backends/duckdb_backend.py +0 -87
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/backends/file_backend.py +0 -165
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/connection_objects_retrieval.py +0 -377
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/connector_runner.py +0 -247
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/errors.py +0 -7
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/evaluation_modes.py +0 -25
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/hacks.py +0 -23
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/json_schema_helper.py +0 -384
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/mitm_addons.py +0 -37
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/models.py +0 -595
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/proxy.py +0 -207
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/secret_access.py +0 -47
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/segment_tracking.py +0 -45
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/commons/utils.py +0 -214
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/conftest.py.disabled +0 -751
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/consts.py +0 -4
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/poetry.lock +0 -4480
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/pytest.ini +0 -9
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/regression_tests/__init__.py +0 -1
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/regression_tests/test_check.py +0 -61
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/regression_tests/test_discover.py +0 -117
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/regression_tests/test_read.py +0 -627
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/regression_tests/test_spec.py +0 -43
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/report.py +0 -542
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/stash_keys.py +0 -38
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/templates/__init__.py +0 -0
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/templates/private_details.html.j2 +0 -305
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/templates/report.html.j2 +0 -515
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/utils.py +0 -187
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/validation_tests/__init__.py +0 -0
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/validation_tests/test_check.py +0 -61
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/validation_tests/test_discover.py +0 -217
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/validation_tests/test_read.py +0 -177
- airbyte_ops_mcp/_legacy/airbyte_ci/connector_live_tests/validation_tests/test_spec.py +0 -631
- {airbyte_internal_ops-0.4.2.dist-info → airbyte_internal_ops-0.5.0.dist-info}/WHEEL +0 -0
- {airbyte_internal_ops-0.4.2.dist-info → airbyte_internal_ops-0.5.0.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>
|