+
{{- .Title -}}
- {{ .Content }}
+
{{ .Content }}
-
+
{{ partial "spinner.html" . }}
@@ -26,13 +25,6 @@
{{- .Title -}}
-
-
-
{{ partial "footer.html" . }}
diff --git a/layouts/partials/menu-ci.html b/layouts/partials/menu-ci.html
index 908b7ab83..2dbbe936c 100644
--- a/layouts/partials/menu-ci.html
+++ b/layouts/partials/menu-ci.html
@@ -5,17 +5,7 @@
diff --git a/static/css/custom.css b/static/css/custom.css
index 2941ba32d..a245bbc5b 100644
--- a/static/css/custom.css
+++ b/static/css/custom.css
@@ -1203,7 +1203,224 @@ h6 .anchor::before {
content: "\00a7";
}
-/* CI Labels */
+/* CI Dashboard */
+
+.ci-dashboard {
+ max-width: 100%;
+}
+
+.ci-dashboard h1 {
+ margin-bottom: 4px;
+}
+
+.ci-subtitle p {
+ color: var(--pf-global--Color--200);
+ margin-bottom: 24px;
+ font-size: 0.95rem;
+}
+
+.ci-tabs {
+ display: flex;
+ gap: 0;
+ border-bottom: 2px solid var(--pf-global--BorderColor--100, #d2d2d2);
+ margin-bottom: 16px;
+}
+
+.ci-tab {
+ padding: 10px 20px;
+ cursor: pointer;
+ font-size: 0.9rem;
+ font-weight: 500;
+ color: var(--pf-global--Color--200, #6a6e73);
+ border: none;
+ background: none;
+ border-bottom: 3px solid transparent;
+ margin-bottom: -2px;
+ transition: color 0.15s, border-color 0.15s;
+}
+
+.ci-tab:hover {
+ color: var(--pf-global--Color--100, #151515);
+}
+
+.ci-tab.active {
+ color: var(--pf-global--primary-color--100, #06c);
+ border-bottom-color: var(--pf-global--primary-color--100, #06c);
+ font-weight: 600;
+}
+
+.ci-toolbar {
+ display: flex;
+ justify-content: flex-end;
+ align-items: center;
+ margin-bottom: 12px;
+ gap: 8px;
+}
+
+.ci-toolbar label {
+ font-size: 0.85rem;
+ color: var(--pf-global--Color--200, #6a6e73);
+}
+
+.ci-toolbar select {
+ font-size: 0.85rem;
+ padding: 4px 8px;
+ border: 1px solid var(--pf-global--BorderColor--100, #d2d2d2);
+ border-radius: 4px;
+ background: var(--pf-global--BackgroundColor--100, #fff);
+ color: var(--pf-global--Color--100, #151515);
+}
+
+.ci-table {
+ width: 100%;
+ border-collapse: separate;
+ border-spacing: 0;
+ font-size: 0.9rem;
+}
+
+.ci-table thead th {
+ text-align: left;
+ padding: 10px 16px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ color: var(--pf-global--Color--200, #6a6e73);
+ border-bottom: 1px solid var(--pf-global--BorderColor--100, #d2d2d2);
+}
+
+.ci-table tbody tr {
+ transition: background-color 0.1s;
+}
+
+.ci-table tbody tr:hover {
+ background-color: var(--pf-global--BackgroundColor--200, #f0f0f0);
+}
+
+.ci-table tbody td {
+ padding: 14px 16px;
+ border-bottom: 1px solid var(--pf-global--BorderColor--100, #d2d2d2);
+ vertical-align: middle;
+}
+
+.ci-status-cell {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ white-space: nowrap;
+}
+
+.ci-status-dot {
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ flex-shrink: 0;
+}
+
+.ci-status-dot.green {
+ background-color: var(--pf-global--success-color--100, #3e8635);
+}
+
+.ci-status-dot.yellow {
+ background-color: var(--pf-global--palette--gold-500, #f0ab00);
+}
+
+.ci-status-dot.red {
+ background-color: var(--pf-global--danger-color--100, #c9190b);
+}
+
+.ci-status-text {
+ font-weight: 500;
+}
+
+.ci-status-text.green {
+ color: var(--pf-global--success-color--100, #3e8635);
+}
+
+.ci-status-text.yellow {
+ color: var(--pf-global--palette--gold-500, #f0ab00);
+}
+
+.ci-status-text.red {
+ color: var(--pf-global--danger-color--100, #c9190b);
+}
+
+.ci-pattern-name {
+ font-weight: 600;
+ color: var(--pf-global--Color--100, #151515);
+}
+
+.ci-pattern-name a {
+ color: inherit;
+ text-decoration: none;
+}
+
+.ci-pattern-name a:hover {
+ color: var(--pf-global--primary-color--100, #06c);
+ text-decoration: underline;
+}
+
+.ci-pattern-branch {
+ display: block;
+ font-size: 0.8rem;
+ color: var(--pf-global--Color--200, #6a6e73);
+ font-weight: 400;
+ margin-top: 2px;
+}
+
+.ci-platform-cell {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.ci-platform-icon {
+ font-size: 1rem;
+ color: var(--pf-global--Color--200, #6a6e73);
+ width: 20px;
+ text-align: center;
+}
+
+.ci-time {
+ color: var(--pf-global--Color--200, #6a6e73);
+ white-space: nowrap;
+}
+
+.ci-history-link {
+ display: block;
+ text-align: center;
+ padding: 16px;
+ font-size: 0.9rem;
+ color: var(--pf-global--Color--100, #151515);
+ font-weight: 500;
+ border-top: 1px solid var(--pf-global--BorderColor--100, #d2d2d2);
+ margin-top: -1px;
+ text-decoration: none;
+}
+
+.ci-history-link:hover {
+ color: var(--pf-global--primary-color--100, #06c);
+}
+
+.ci-section-header {
+ font-size: 1.1rem;
+ font-weight: 600;
+ margin: 24px 0 8px 0;
+ padding-bottom: 6px;
+ border-bottom: 2px solid var(--pf-global--BorderColor--100, #d2d2d2);
+ color: var(--pf-global--Color--100, #151515);
+}
+
+.ci-section-header:first-of-type {
+ margin-top: 0;
+}
+
+.ci-empty {
+ text-align: center;
+ padding: 40px 16px;
+ color: var(--pf-global--Color--200, #6a6e73);
+ font-style: italic;
+}
.ci-label {
font-size: 0.8rem;
@@ -1248,9 +1465,279 @@ h6 .anchor::before {
padding: 0 5px;
}
-/* CI icon styles - placeholder for future use */
+/* Card-based overview */
+
+.ci-stats-bar {
+ margin-bottom: 20px;
+ padding: 16px 20px;
+ background: var(--pf-global--BackgroundColor--200, #f0f0f0);
+ border-radius: 8px;
+}
+
+.ci-stats-text {
+ font-size: 0.95rem;
+ color: var(--pf-global--Color--100, #151515);
+ margin-bottom: 8px;
+}
+
+.ci-stats-number {
+ font-weight: 700;
+ font-size: 1.1rem;
+ color: var(--pf-global--success-color--100, #3e8635);
+}
+
+.ci-stats-note {
+ color: var(--pf-global--Color--200, #6a6e73);
+ font-size: 0.85rem;
+}
+
+.ci-stats-note-warn {
+ color: var(--pf-global--palette--gold-500, #f0ab00);
+}
+
+.ci-stats-loading-text {
+ color: var(--pf-global--Color--200, #6a6e73);
+ font-style: italic;
+}
+
+.ci-stats-progress {
+ height: 6px;
+ background: var(--pf-global--BorderColor--100, #d2d2d2);
+ border-radius: 3px;
+ overflow: hidden;
+}
+
+.ci-stats-progress-fill {
+ height: 100%;
+ background: var(--pf-global--success-color--100, #3e8635);
+ border-radius: 3px;
+ transition: width 0.4s ease;
+}
+
+.ci-overview-legend {
+ font-size: 0.82rem;
+ color: var(--pf-global--Color--200, #6a6e73);
+ margin-bottom: 16px;
+}
+
+.ci-legend-bar {
+ display: inline-block;
+ width: 4px;
+ height: 14px;
+ border-radius: 1px;
+ vertical-align: middle;
+ margin-left: 8px;
+ margin-right: 2px;
+}
+
+.ci-legend-bar.green {
+ background-color: var(--pf-global--success-color--100, #3e8635);
+}
+
+.ci-legend-bar.gray {
+ background-color: var(--pf-global--disabled-color--200, #b8bbbe);
+}
+
+.ci-legend-bar.red {
+ background-color: var(--pf-global--danger-color--100, #c9190b);
+}
+
+.ci-card-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+ gap: 16px;
+ margin-bottom: 24px;
+}
+
+.ci-card {
+ display: flex;
+ flex-direction: column;
+ border: 1px solid var(--pf-global--BorderColor--100, #d2d2d2);
+ border-radius: 8px;
+ padding: 20px;
+ background: var(--pf-global--BackgroundColor--100, #fff);
+ text-decoration: none;
+ color: inherit;
+ transition: box-shadow 0.15s, border-color 0.15s;
+ cursor: pointer;
+}
+
+.ci-card:hover {
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ border-color: var(--pf-global--Color--200, #6a6e73);
+ text-decoration: none;
+ color: inherit;
+}
+
+.ci-card[data-health="green"],
+.ci-card[data-health="green-with-infra"] {
+ border-left: 4px solid var(--pf-global--success-color--100, #3e8635);
+}
+
+.ci-card[data-health="has-failures"] {
+ border-left: 4px solid var(--pf-global--palette--orange-300, #ec7a08);
+}
+
+.ci-card-header {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 8px;
+}
+
+.ci-card-health {
+ flex-shrink: 0;
+ width: 20px;
+ height: 20px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.ci-card-title {
+ font-size: 1.05rem;
+ font-weight: 600;
+ color: var(--pf-global--Color--100, #151515);
+ line-height: 1.3;
+}
+
+.ci-card-summary {
+ font-size: 0.85rem;
+ margin-bottom: 12px;
+ font-weight: 500;
+}
+
+.ci-card-summary.green,
+.ci-card-summary.green-with-infra {
+ color: var(--pf-global--success-color--100, #3e8635);
+}
+
+.ci-card-summary.has-failures {
+ color: var(--pf-global--palette--orange-300, #ec7a08);
+}
+
+.ci-card-summary.loading {
+ color: var(--pf-global--Color--200, #6a6e73);
+ font-style: italic;
+}
+
+.ci-card-platforms {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ margin-bottom: 12px;
+}
+
+.ci-card-platform {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ font-size: 0.8rem;
+ color: var(--pf-global--Color--200, #6a6e73);
+}
+
+.ci-card-platform-dot {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ flex-shrink: 0;
+}
+
+.ci-card-platform-dot.loading {
+ background-color: var(--pf-global--BorderColor--100, #d2d2d2);
+}
+
+.ci-card-platform-dot.green {
+ background-color: var(--pf-global--success-color--100, #3e8635);
+}
+
+.ci-card-platform-dot.yellow {
+ background-color: var(--pf-global--disabled-color--200, #b8bbbe);
+}
+
+.ci-card-platform-dot.red {
+ background-color: var(--pf-global--danger-color--100, #c9190b);
+}
+
+.ci-card-platform-label {
+ white-space: nowrap;
+}
+
+.ci-card-blocks {
+ display: flex;
+ gap: 2px;
+ margin-top: auto;
+ padding-top: 8px;
+}
+
+.ci-card-block {
+ width: 4px;
+ height: 16px;
+ border-radius: 1px;
+ flex-shrink: 0;
+}
+
+.ci-card-block.loading {
+ background-color: var(--pf-global--BorderColor--100, #d2d2d2);
+}
+
+.ci-card-block.green {
+ background-color: var(--pf-global--success-color--100, #3e8635);
+}
+
+.ci-card-block.yellow {
+ background-color: var(--pf-global--disabled-color--200, #b8bbbe);
+}
+
+.ci-card-block.red {
+ background-color: var(--pf-global--danger-color--100, #c9190b);
+}
+
+.ci-card-footer {
+ font-size: 0.8rem;
+ color: var(--pf-global--Color--200, #6a6e73);
+}
+
+.ci-back-link {
+ display: inline-block;
+ margin-bottom: 12px;
+ font-size: 0.9rem;
+ color: var(--pf-global--primary-color--100, #06c);
+ text-decoration: none;
+ font-weight: 500;
+}
+
+.ci-back-link:hover {
+ text-decoration: underline;
+}
+
+.ci-detail-title {
+ font-size: 1.4rem;
+ font-weight: 600;
+ margin-bottom: 12px;
+ color: var(--pf-global--Color--100, #151515);
+}
+
+.ci-status-key {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+ margin-bottom: 16px;
+ padding: 12px 16px;
+ background: var(--pf-global--BackgroundColor--200, #f0f0f0);
+ border-radius: 6px;
+ font-size: 0.85rem;
+ color: var(--pf-global--Color--100, #151515);
+}
+
+.ci-status-key-item {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+}
+
.ci-icon {
- display: inline-block; /* placeholder property */
+ display: inline-block;
}
.pf-c-content ul.links-menu {
diff --git a/static/data/sample-badges.json b/static/data/sample-badges.json
new file mode 100644
index 000000000..da7240fd1
--- /dev/null
+++ b/static/data/sample-badges.json
@@ -0,0 +1,605 @@
+[
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "industrialedge-aws-4.18-stable-badge.json",
+ "pattern": "industrialedge",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-16"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitopshcp-aws-4.20-stable-badge.json",
+ "pattern": "mcgitopshcp",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-15"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "ragllm-aws-4.21-stable-badge.json",
+ "pattern": "ragllm",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-15"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "ragllm-azr-4.20-stable-badge.json",
+ "pattern": "ragllm",
+ "platform": "azr",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-15"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "aegitops-aws-4.18-stable-badge.json",
+ "pattern": "aegitops",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-14"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "aegitops-aws-4.21-stable-badge.json",
+ "pattern": "aegitops",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-14"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "hypershift-aws-4.20-stable-badge.json",
+ "pattern": "hypershift",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-14"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "medicaldiag-aws-4.18-stable-badge.json",
+ "pattern": "medicaldiag",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-14"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "hypershift-aws-4.21-stable-badge.json",
+ "pattern": "hypershift",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-13"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitops-aws-4.21-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-13"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "medicaldiag-aws-4.21-stable-badge.json",
+ "pattern": "medicaldiag",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-13"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "medicaldiag-azr-4.20-stable-badge.json",
+ "pattern": "medicaldiag",
+ "platform": "azr",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-13"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "openshiftai-intel-4.18-stable-badge.json",
+ "pattern": "openshiftai",
+ "platform": "intel",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-12"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "openshiftai-intel-4.20-stable-badge.json",
+ "pattern": "openshiftai",
+ "platform": "intel",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-12"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "openshiftai-intel-4.21-stable-badge.json",
+ "pattern": "openshiftai",
+ "platform": "intel",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-12"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitops-intel-4.18-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "intel",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-11"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitops-intel-4.20-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "intel",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-11"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitops-intel-4.21-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "intel",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-11"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitopsstandalone-aws-4.21-stable-badge.json",
+ "pattern": "mcgitopsstandalone",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-11"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "openshiftai-aws-4.21-stable-badge.json",
+ "pattern": "openshiftai",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-11"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "patternsoperator-aws-4.18-stable-badge.json",
+ "pattern": "patternsoperator",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-11"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "travelops-aws-4.21-stable-badge.json",
+ "pattern": "travelops",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-11"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "coco-azr-4.21-stable-badge.json",
+ "pattern": "coco",
+ "platform": "azr",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-10"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitopshcp-aws-4.21-stable-badge.json",
+ "pattern": "mcgitopshcp",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-10"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "openshiftai-aws-4.18-stable-badge.json",
+ "pattern": "openshiftai",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-10"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "hypershift-aws-4.18-stable-badge.json",
+ "pattern": "hypershift",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-09"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "travelops-aws-4.18-stable-badge.json",
+ "pattern": "travelops",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-09"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "travelops-aws-4.20-stable-badge.json",
+ "pattern": "travelops",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-09"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "industrialedge-azr-4.20-stable-badge.json",
+ "pattern": "industrialedge",
+ "platform": "azr",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-08"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "ragllm-aws-4.18-stable-badge.json",
+ "pattern": "ragllm",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-08"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "aegitops-aws-4.20-stable-badge.json",
+ "pattern": "aegitops",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-07"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitopsstandalone-aws-4.20-stable-badge.json",
+ "pattern": "mcgitopsstandalone",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-07"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "coco-azr-4.18-stable-badge.json",
+ "pattern": "coco",
+ "platform": "azr",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-06"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "coco-azr-4.20-stable-badge.json",
+ "pattern": "coco",
+ "platform": "azr",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-06"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "layeredzerotrust-aws-4.20-stable-badge.json",
+ "pattern": "layeredzerotrust",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-06"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitops-aws-4.20-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-06"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitops-azr-4.18-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "azr",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-06"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitopshcp-aws-4.18-stable-badge.json",
+ "pattern": "mcgitopshcp",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-06"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitopsstandalone-gcp-4.18-stable-badge.json",
+ "pattern": "mcgitopsstandalone",
+ "platform": "gcp",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-06"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "openshiftai-aws-4.20-stable-badge.json",
+ "pattern": "openshiftai",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-06"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "patternsoperator-aws-4.20-stable-badge.json",
+ "pattern": "patternsoperator",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-04-06"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitopsstandalone-aws-4.18-stable-badge.json",
+ "pattern": "mcgitopsstandalone",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-04-05"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitops-gcp-4.21-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "gcp",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-04-01"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "agof-aws-none-stable-badge.json",
+ "pattern": "agof",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "none",
+ "date": "2026-03-06"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "industrialedge-aws-4.21-stable-badge.json",
+ "pattern": "industrialedge",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.21",
+ "date": "2026-02-27"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitops-aws-4.18-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.18",
+ "date": "2026-02-23"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "aegitops-aws-4.19-stable-badge.json",
+ "pattern": "aegitops",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-17"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitops-aws-4.19-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-16"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitopshcp-aws-4.19-stable-badge.json",
+ "pattern": "mcgitopshcp",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-16"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "medicaldiag-aws-4.20-stable-badge.json",
+ "pattern": "medicaldiag",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.20",
+ "date": "2026-02-16"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "hypershift-aws-4.19-stable-badge.json",
+ "pattern": "hypershift",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-13"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "ragllm-aws-4.19-stable-badge.json",
+ "pattern": "ragllm",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-13"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "medicaldiag-azr-4.19-stable-badge.json",
+ "pattern": "medicaldiag",
+ "platform": "azr",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-09"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "openshiftai-intel-4.19-stable-badge.json",
+ "pattern": "openshiftai",
+ "platform": "intel",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-08"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitops-intel-4.19-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "intel",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-07"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitopsstandalone-aws-4.19-stable-badge.json",
+ "pattern": "mcgitopsstandalone",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-06"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "openshiftai-aws-4.19-stable-badge.json",
+ "pattern": "openshiftai",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-06"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "travelops-aws-4.19-stable-badge.json",
+ "pattern": "travelops",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-05"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "industrialedge-aws-4.19-stable-badge.json",
+ "pattern": "industrialedge",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-04"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "coco-azr-4.19-stable-badge.json",
+ "pattern": "coco",
+ "platform": "azr",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-03"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "patternsoperator-aws-4.19-stable-badge.json",
+ "pattern": "patternsoperator",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-03"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "mcgitops-gcp-4.19-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "gcp",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2026-02-01"
+ },
+ {
+ "base": "https://storage.googleapis.com/vp-results",
+ "key": "layeredzerotrust-aws-4.19-stable-badge.json",
+ "pattern": "layeredzerotrust",
+ "platform": "aws",
+ "operator": "N/A",
+ "version": "4.19",
+ "date": "2025-12-22"
+ },
+ {
+ "base": "https://vp-ntnx-results.s3.amazonaws.com",
+ "key": "mcgitops-nutanix-4.12-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "nutanix",
+ "operator": "N/A",
+ "version": "4.12",
+ "date": "2024-04-03"
+ },
+ {
+ "base": "https://vp-ntnx-results.s3.amazonaws.com",
+ "key": "mcgitops-nutanix-4.13-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "nutanix",
+ "operator": "N/A",
+ "version": "4.13",
+ "date": "2024-04-03"
+ },
+ {
+ "base": "https://vp-ntnx-results.s3.amazonaws.com",
+ "key": "mcgitops-nutanix-4.14-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "nutanix",
+ "operator": "N/A",
+ "version": "4.14",
+ "date": "2024-04-03"
+ },
+ {
+ "base": "https://vp-ntnx-results.s3.amazonaws.com",
+ "key": "mcgitops-nutanix-4.15-stable-badge.json",
+ "pattern": "mcgitops",
+ "platform": "nutanix",
+ "operator": "N/A",
+ "version": "4.15",
+ "date": "2024-04-03"
+ }
+]
\ No newline at end of file
diff --git a/static/js/dashboard.v2.js b/static/js/dashboard.v2.js
index c33f347c8..32ae1710f 100644
--- a/static/js/dashboard.v2.js
+++ b/static/js/dashboard.v2.js
@@ -1,9 +1,11 @@
+// ============================================
+// Data Classes & Parsing
+// ============================================
+
class Badge {
constructor (base, key, date) {
this.base = base
- //this.base = '/ci/vp-results'
- //this.base = 'https://storage.googleapis.com/vp-results'
this.key = key
const fields = key.split('-')
this.pattern = fields[0]
@@ -30,23 +32,14 @@ class Badge {
}
}
+// ============================================
+// Helper Functions
+// ============================================
+
function getJiraSearch (pattern) {
return 'https://issues.redhat.com/issues/?jql=project%3D%22Validated%20Patterns%22%20and%20labels%20in%20(ci-fail)%20and%20component%3D' + jira_component(pattern) + '%20and%20status%20not%20in%20(Closed)'
}
-function getLabel (field, json_obj) {
- if (field == 'pattern') {
- return stringForKey(json_obj.infraProvider) + ' ' + json_obj.openshiftVersion
- }
- if (field == 'platform') {
- return stringForKey(json_obj.patternName) + ' - ' + json_obj.openshiftVersion
- }
- if (field == 'version') {
- return stringForKey(json_obj.patternName) + ' : ' + stringForKey(json_obj.infraProvider)
- }
- return stringForKey(json_obj.patternName) + ' : ' + stringForKey(json_obj.infraProvider) + ' ' + json_obj.openshiftVersion
-}
-
function sleep (ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
@@ -70,16 +63,6 @@ function filterBadges (badges, field, value) {
return badges
}
-function rowTitle (field, value) {
- if (field === 'pattern') {
- return stringForKey(value)
- }
- if (field === 'platform') {
- return stringForKey(value)
- }
- return value
-}
-
function jira_component (pattern) {
if (pattern == 'aegitops') {
return 'ansible-edge'
@@ -242,6 +225,55 @@ function toTitleCase (str) {
)
}
+// ============================================
+// Network / JSON Fetching
+// ============================================
+
+function jsonSuccess() {
+ this.callback.apply(this, this.arguments);
+}
+
+function jsonError() {
+ console.error(this.statusText);
+}
+
+function getJSON(url, callback, ...args) {
+ const jsonRequest = new XMLHttpRequest();
+ jsonRequest.callback = callback;
+ jsonRequest.arguments = args;
+ jsonRequest.onload = jsonSuccess;
+ jsonRequest.onerror = jsonError;
+ jsonRequest.open("GET", url, true);
+ jsonRequest.send(null);
+}
+
+// ============================================
+// Legacy Badge Rendering (for pattern page embeds)
+// ============================================
+
+function getLabel (field, json_obj) {
+ if (field == 'pattern') {
+ return stringForKey(json_obj.infraProvider) + ' ' + json_obj.openshiftVersion
+ }
+ if (field == 'platform') {
+ return stringForKey(json_obj.patternName) + ' - ' + json_obj.openshiftVersion
+ }
+ if (field == 'version') {
+ return stringForKey(json_obj.patternName) + ' : ' + stringForKey(json_obj.infraProvider)
+ }
+ return stringForKey(json_obj.patternName) + ' : ' + stringForKey(json_obj.infraProvider) + ' ' + json_obj.openshiftVersion
+}
+
+function rowTitle (field, value) {
+ if (field === 'pattern') {
+ return stringForKey(value)
+ }
+ if (field === 'platform') {
+ return stringForKey(value)
+ }
+ return value
+}
+
function renderSetButtons(sets){
var currentURL = new URL(window.location.href)
const queryString = window.location.search
@@ -266,24 +298,6 @@ function renderSetButtons(sets){
return buttonText
}
-function jsonSuccess() {
- this.callback.apply(this, this.arguments);
-}
-
-function jsonError() {
- console.error(this.statusText);
-}
-
-function getJSON(url, callback, ...args) {
- const jsonRequest = new XMLHttpRequest();
- jsonRequest.callback = callback;
- jsonRequest.arguments = args;
- jsonRequest.onload = jsonSuccess;
- jsonRequest.onerror = jsonError;
- jsonRequest.open("GET", url, true);
- jsonRequest.send(null);
-}
-
function renderSingleBadge (key, field, linkType, badge_url) {
var json_obj = JSON.parse(this.responseText)
var branchLabel = json_obj.patternBranch
@@ -372,6 +386,684 @@ function createFilteredHorizontalTable (badges, field, value, titles, links) {
return tableText + '