From 5f45a3a9a2cf79ad441711fd479d53c3e7f3138f Mon Sep 17 00:00:00 2001 From: Steven Zhang Date: Sat, 23 Aug 2025 10:09:38 -0700 Subject: [PATCH] Image Overview page with mockdata --- .../components/ImageRiskAssessment.vue | 4 +- .../components/TopRiskyImagesChart.vue | 4 +- .../common/DownloadCustomReport.vue | 34 ++ .../config/table-headers.ts | 85 +++++ .../data/sbombastic.rancher.io.image.js | 290 ++++++++++++++++++ .../formatters/IdentifiedCVEsCell.vue | 19 ++ .../IdentifiedCVEsPercentageCell.vue | 19 ++ .../formatters/ImageNameCell.vue | 25 ++ .../l10n/en-us.yaml | 13 + .../ImageOverview.vue | 251 ++++++++------- 10 files changed, 628 insertions(+), 116 deletions(-) create mode 100644 pkg/sbombastic-image-vulnerability-scanner/components/common/DownloadCustomReport.vue create mode 100644 pkg/sbombastic-image-vulnerability-scanner/data/sbombastic.rancher.io.image.js create mode 100644 pkg/sbombastic-image-vulnerability-scanner/formatters/IdentifiedCVEsCell.vue create mode 100644 pkg/sbombastic-image-vulnerability-scanner/formatters/IdentifiedCVEsPercentageCell.vue create mode 100644 pkg/sbombastic-image-vulnerability-scanner/formatters/ImageNameCell.vue diff --git a/pkg/sbombastic-image-vulnerability-scanner/components/ImageRiskAssessment.vue b/pkg/sbombastic-image-vulnerability-scanner/components/ImageRiskAssessment.vue index 42c45b8..b1ea3f5 100644 --- a/pkg/sbombastic-image-vulnerability-scanner/components/ImageRiskAssessment.vue +++ b/pkg/sbombastic-image-vulnerability-scanner/components/ImageRiskAssessment.vue @@ -1,10 +1,10 @@ diff --git a/pkg/sbombastic-image-vulnerability-scanner/components/TopRiskyImagesChart.vue b/pkg/sbombastic-image-vulnerability-scanner/components/TopRiskyImagesChart.vue index d820681..cbea8e5 100644 --- a/pkg/sbombastic-image-vulnerability-scanner/components/TopRiskyImagesChart.vue +++ b/pkg/sbombastic-image-vulnerability-scanner/components/TopRiskyImagesChart.vue @@ -4,8 +4,8 @@ Most affected images at risk
-
{{ image.image_name }}
- +
{{ image.imageName }}
+
diff --git a/pkg/sbombastic-image-vulnerability-scanner/components/common/DownloadCustomReport.vue b/pkg/sbombastic-image-vulnerability-scanner/components/common/DownloadCustomReport.vue new file mode 100644 index 0000000..ace312a --- /dev/null +++ b/pkg/sbombastic-image-vulnerability-scanner/components/common/DownloadCustomReport.vue @@ -0,0 +1,34 @@ + + + diff --git a/pkg/sbombastic-image-vulnerability-scanner/config/table-headers.ts b/pkg/sbombastic-image-vulnerability-scanner/config/table-headers.ts index 2e944e7..0ae0298 100644 --- a/pkg/sbombastic-image-vulnerability-scanner/config/table-headers.ts +++ b/pkg/sbombastic-image-vulnerability-scanner/config/table-headers.ts @@ -145,3 +145,88 @@ export const VEX_MANAGEMENT_TABLE = [ sort: "metadata.creationTimestamp", }, ]; + +export const IMAGE_LIST_TABLE = [ + { + name: "name", + labelKey: "imageScanner.images.listTable.headers.imageName", + value: "metadata.name", + formatter: "ImageNameCell", + sort: "metadata.name", + }, + { + name: "cves", + labelKey: "imageScanner.images.listTable.headers.identifiedCVEs", + value: "spec.scanResult", + formatter: "IdentifiedCVEsCell", + sort: "spec.scanResult", + width: 300, + }, + { + name: "repository", + labelKey: "imageScanner.images.listTable.headers.repository", + value: "spec.repository", + sort: "spec..repository", + }, + { + name: "registry", + labelKey: "imageScanner.images.listTable.headers.registry", + value: "spec.registry", + sort: "spec.registry", + } +]; + +export const REPO_BASED_TABLE = [ + { + name: "repository", + labelKey: "imageScanner.images.listTable.headers.repository", + value: "repository", + sort: "repository", + width: 200, + }, + { + name: "cves", + labelKey: "imageScanner.images.listTable.headers.vulnerabilities", + value: "cveCntByRepo", + formatter: "IdentifiedCVEsPercentageCell", + sort: "cveCntByRepo", + width: 300, + }, + { + name: "registry", + labelKey: "imageScanner.images.listTable.headers.registry", + value: "registry", + sort: "registry", + width: 450, + }, +]; + +export const REPO_BASED_IMAGE_LIST_TABLE = [ + { + name: "", + value: "", + sort: "", + width: 60, + }, + { + name: "image", + labelKey: "imageScanner.images.listTable.headers.imageName", + formatter: "ImageNameCell", + sort: "metadata.name", + width: 200, + }, + { + name: "cves", + labelKey: "imageScanner.images.listTable.headers.identifiedCVEs", + value: "scanResult", + formatter: "IdentifiedCVEsCell", + sort: "imageScanner", + width: 310, + }, + { + name: "", + value: "", + sort: "", + width: 450, + }, +]; diff --git a/pkg/sbombastic-image-vulnerability-scanner/data/sbombastic.rancher.io.image.js b/pkg/sbombastic-image-vulnerability-scanner/data/sbombastic.rancher.io.image.js new file mode 100644 index 0000000..8f899be --- /dev/null +++ b/pkg/sbombastic-image-vulnerability-scanner/data/sbombastic.rancher.io.image.js @@ -0,0 +1,290 @@ +export const images = [ + { + metadata: { + name: "struts-attacher:1.0", + }, + spec: { + repository: "coredns", + registry: "Docker Hub", + scanResult: { + critical: 128, + high: 12, + medium: 81, + low: 526, + none: 126 + } + }, + }, + { + metadata: { + name: "imagemagick4.8.5613", + }, + spec: { + repository: "demo-cody-protected", + registry: "demo.suse-security-ivs.io", + scanResult: { + critical: 7, + high: 0, + medium: 1028, + low: 24, + none: 18 + } + }, + }, + { + metadata: { + name: "centos7.7.1908", + }, + spec: { + repository: "kube-controller-manager", + registry: "ecr.ap-southeast-emea.2", + scanResult: { + critical: 72, + high: 0, + medium: 164, + low: 0, + none: 7 + } + }, + }, + { + metadata: { + name: "nginx1.19.10", + }, + spec: { + repository: "kube-apiserver", + registry: "Docker Hub", + scanResult: { + critical: 150, + high: 5, + medium: 850, + low: 600, + none: 73 + } + }, + }, + { + metadata: { + name: "docker-compose:1.29.2", + }, + spec: { + repository: "coredns", + registry: "Docker Hub", + scanResult: { + critical: 35, + high: 2, + medium: 450, + low: 120, + none: 9 + } + }, + }, + { + metadata: { + name: "python3.9.7", + }, + spec: { + repository: "flask-app", + registry: "pypi.org", + scanResult: { + critical: 80, + high: 3, + medium: 1100, + low: 50, + none: 0 + } + }, + }, + { + metadata: { + name: "nodejs14.17.3", + }, + spec: { + repository: "web-server", + registry: "npmjs.com", + scanResult: { + critical: 100, + high: 0, + medium: 2000, + low: 300, + none: 40 + } + }, + }, + { + metadata: { + name: "redis5.0.7", + }, + spec: { + repository: "cache-service", + registry: "Docker Hub", + scanResult: { + critical: 58, + high: 0, + medium: 700, + low: 0, + none: 11 + } + }, + }, + { + metadata: { + name: "mongodb4.4.1", + }, + spec: { + repository: "data-store", + registry: "mongodb.com", + scanResult: { + critical: 45, + high: 2, + medium: 900, + low: 150, + none: 12 + } + }, + }, + { + metadata: { + name: "golang1.16.5", + }, + spec: { + repository: "api-gateway", + registry: "demo.suse-security-ivs.io", + scanResult: { + critical: 75, + high: 1, + medium: 1200, + low: 10, + none: 18 + } + }, + }, + { + metadata: { + name: "ruby2.7.3", + }, + spec: { + repository: "web-application", + registry: "rubygems.org", + scanResult: { + critical: 60, + high: 1, + medium: 500, + low: 80, + none: 0 + } + }, + }, + { + metadata: { + name: "elasticsearch7.10.0", + }, + spec: { + repository: "search-service", + registry: "docker.elastic.co", + scanResult: { + critical: 90, + high: 0, + medium: 1800, + low: 300, + none: 20 + } + }, + }, + { + metadata: { + name: "mysql8.0.25", + }, + spec: { + repository: "database-service", + registry: "mysql.com", + scanResult: { + critical: 70, + high: 0, + medium: 850, + low: 0, + none: 14 + } + }, + }, + { + metadata: { + name: "php8.0.9", + }, + spec: { + repository: "web-backend", + registry: "php.net", + scanResult: { + critical: 55, + high: 0, + medium: 400, + low: 60, + none: 5 + } + }, + }, + { + metadata: { + name: "postgresql13.3", + }, + spec: { + repository: "data-service", + registry: "docker.io", + scanResult: { + critical: 85, + high: 2, + medium: 1100, + low: 45, + none: 12 + } + }, + }, + { + metadata: { + name: "terraform1.0.0", + }, + spec: { + repository: "infrastructure-as-code", + registry: "demo.suse-security-ivs.io", + scanResult: { + critical: 40, + high: 1, + medium: 300, + low: 10, + none: 0 + } + }, + }, + { + metadata: { + name: "ansible2.10.5", + }, + spec: { + repository: "automation-service", + registry: "galaxy.ansible.com", + scanResult: { + critical: 65, + high: 0, + medium: 600, + low: 90, + none: 10 + } + }, + }, + { + metadata: { + name: "kafka2.8.0", + }, + spec: { + repository: "streaming-service", + registry: "confluent.io", + scanResult: { + critical: 80, + high: 0, + medium: 1300, + low: 0, + none: 16 + } + }, + }, +]; \ No newline at end of file diff --git a/pkg/sbombastic-image-vulnerability-scanner/formatters/IdentifiedCVEsCell.vue b/pkg/sbombastic-image-vulnerability-scanner/formatters/IdentifiedCVEsCell.vue new file mode 100644 index 0000000..885485d --- /dev/null +++ b/pkg/sbombastic-image-vulnerability-scanner/formatters/IdentifiedCVEsCell.vue @@ -0,0 +1,19 @@ + + \ No newline at end of file diff --git a/pkg/sbombastic-image-vulnerability-scanner/formatters/IdentifiedCVEsPercentageCell.vue b/pkg/sbombastic-image-vulnerability-scanner/formatters/IdentifiedCVEsPercentageCell.vue new file mode 100644 index 0000000..7e8d6ef --- /dev/null +++ b/pkg/sbombastic-image-vulnerability-scanner/formatters/IdentifiedCVEsPercentageCell.vue @@ -0,0 +1,19 @@ + + \ No newline at end of file diff --git a/pkg/sbombastic-image-vulnerability-scanner/formatters/ImageNameCell.vue b/pkg/sbombastic-image-vulnerability-scanner/formatters/ImageNameCell.vue new file mode 100644 index 0000000..d58a3e8 --- /dev/null +++ b/pkg/sbombastic-image-vulnerability-scanner/formatters/ImageNameCell.vue @@ -0,0 +1,25 @@ + + \ No newline at end of file diff --git a/pkg/sbombastic-image-vulnerability-scanner/l10n/en-us.yaml b/pkg/sbombastic-image-vulnerability-scanner/l10n/en-us.yaml index 713de86..dc2ed0f 100644 --- a/pkg/sbombastic-image-vulnerability-scanner/l10n/en-us.yaml +++ b/pkg/sbombastic-image-vulnerability-scanner/l10n/en-us.yaml @@ -70,6 +70,8 @@ imageScanner: downloadReport: Download full report imageBySeverityChart: title: Most affected images at risk + imageRiskAssessment: + title: Image risk assessment subTitle: images in total filters: image: @@ -84,6 +86,17 @@ imageScanner: severity: severity repository: repository registry: Registry + buttons: + downloadCustomReport: Download custom report + listTable: + checkbox: + groupByRepo: Group by repository + headers: + imageName: Image name + identifiedCVEs: Identified CVEs + repository: Repository + registry: Registry + vulnerabilities: vulnerabilities vulnerabilities: title: Vulnerabilities vexManagement: diff --git a/pkg/sbombastic-image-vulnerability-scanner/pages/c/_cluster/sbombastic-image-vulnerability-scanner/ImageOverview.vue b/pkg/sbombastic-image-vulnerability-scanner/pages/c/_cluster/sbombastic-image-vulnerability-scanner/ImageOverview.vue index f020706..567f6a1 100644 --- a/pkg/sbombastic-image-vulnerability-scanner/pages/c/_cluster/sbombastic-image-vulnerability-scanner/ImageOverview.vue +++ b/pkg/sbombastic-image-vulnerability-scanner/pages/c/_cluster/sbombastic-image-vulnerability-scanner/ImageOverview.vue @@ -33,73 +33,82 @@
- - -
-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- + +
+ + + + +