Skip to content

Commit e44c496

Browse files
committed
ci: add tests with postgres:13
1 parent 41cee47 commit e44c496

File tree

4 files changed

+9186
-95
lines changed

4 files changed

+9186
-95
lines changed

src/app/commands.rs

Lines changed: 24 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -104,34 +104,18 @@ where
104104
};
105105

106106
if !scan_result.vulnerabilities().is_empty() {
107+
let vulns = scan_result
108+
.vulnerabilities()
109+
.iter()
110+
.counts_by(|v| v.severity());
107111
diagnostic.message = format!(
108112
"Vulnerabilities found for {}: {} Critical, {} High, {} Medium, {} Low, {} Negligible",
109113
image_name,
110-
scan_result
111-
.vulnerabilities()
112-
.iter()
113-
.filter(|v| { matches!(v.severity(), Severity::Critical) })
114-
.count(),
115-
scan_result
116-
.vulnerabilities()
117-
.iter()
118-
.filter(|v| { matches!(v.severity(), Severity::High) })
119-
.count(),
120-
scan_result
121-
.vulnerabilities()
122-
.iter()
123-
.filter(|v| { matches!(v.severity(), Severity::Medium) })
124-
.count(),
125-
scan_result
126-
.vulnerabilities()
127-
.iter()
128-
.filter(|v| { matches!(v.severity(), Severity::Low) })
129-
.count(),
130-
scan_result
131-
.vulnerabilities()
132-
.iter()
133-
.filter(|v| { matches!(v.severity(), Severity::Negligible) })
134-
.count(),
114+
vulns.get(&Severity::Critical).unwrap_or(&0_usize),
115+
vulns.get(&Severity::High).unwrap_or(&0_usize),
116+
vulns.get(&Severity::Medium).unwrap_or(&0_usize),
117+
vulns.get(&Severity::Low).unwrap_or(&0_usize),
118+
vulns.get(&Severity::Negligible).unwrap_or(&0_usize),
135119
);
136120

137121
diagnostic.severity = Some(if scan_result.evaluation_result().is_passed() {
@@ -245,33 +229,14 @@ pub fn diagnostics_for_layers(
245229
layer_idx = layer_idx.and_then(|x| x.checked_sub(1));
246230

247231
if !layer.vulnerabilities().is_empty() {
232+
let vulns = layer.vulnerabilities().iter().counts_by(|v| v.severity());
248233
let msg = format!(
249234
"Vulnerabilities found in layer: {} Critical, {} High, {} Medium, {} Low, {} Negligible",
250-
layer
251-
.vulnerabilities()
252-
.iter()
253-
.filter(|v| { matches!(v.severity(), Severity::Critical) })
254-
.count(),
255-
layer
256-
.vulnerabilities()
257-
.iter()
258-
.filter(|v| { matches!(v.severity(), Severity::High) })
259-
.count(),
260-
layer
261-
.vulnerabilities()
262-
.iter()
263-
.filter(|v| { matches!(v.severity(), Severity::Medium) })
264-
.count(),
265-
layer
266-
.vulnerabilities()
267-
.iter()
268-
.filter(|v| { matches!(v.severity(), Severity::Low) })
269-
.count(),
270-
layer
271-
.vulnerabilities()
272-
.iter()
273-
.filter(|v| { matches!(v.severity(), Severity::Negligible) })
274-
.count(),
235+
vulns.get(&Severity::Critical).unwrap_or(&0_usize),
236+
vulns.get(&Severity::High).unwrap_or(&0_usize),
237+
vulns.get(&Severity::Medium).unwrap_or(&0_usize),
238+
vulns.get(&Severity::Low).unwrap_or(&0_usize),
239+
vulns.get(&Severity::Negligible).unwrap_or(&0_usize),
275240
);
276241
let diagnostic = Diagnostic {
277242
range: instr.range,
@@ -339,33 +304,17 @@ fn diagnostic_for_image(line: u32, document_text: &str, scan_result: &ScanResult
339304
};
340305

341306
if !scan_result.vulnerabilities().is_empty() {
307+
let vulns = scan_result
308+
.vulnerabilities()
309+
.iter()
310+
.counts_by(|v| v.severity());
342311
diagnostic.message = format!(
343312
"Total vulnerabilities found: {} Critical, {} High, {} Medium, {} Low, {} Negligible",
344-
scan_result
345-
.vulnerabilities()
346-
.iter()
347-
.filter(|v| { matches!(v.severity(), Severity::Critical) })
348-
.count(),
349-
scan_result
350-
.vulnerabilities()
351-
.iter()
352-
.filter(|v| { matches!(v.severity(), Severity::High) })
353-
.count(),
354-
scan_result
355-
.vulnerabilities()
356-
.iter()
357-
.filter(|v| { matches!(v.severity(), Severity::Medium) })
358-
.count(),
359-
scan_result
360-
.vulnerabilities()
361-
.iter()
362-
.filter(|v| { matches!(v.severity(), Severity::Low) })
363-
.count(),
364-
scan_result
365-
.vulnerabilities()
366-
.iter()
367-
.filter(|v| { matches!(v.severity(), Severity::Negligible) })
368-
.count(),
313+
vulns.get(&Severity::Critical).unwrap_or(&0_usize),
314+
vulns.get(&Severity::High).unwrap_or(&0_usize),
315+
vulns.get(&Severity::Medium).unwrap_or(&0_usize),
316+
vulns.get(&Severity::Low).unwrap_or(&0_usize),
317+
vulns.get(&Severity::Negligible).unwrap_or(&0_usize),
369318
);
370319

371320
diagnostic.severity = Some(if scan_result.evaluation_result().is_passed() {

src/infra/sysdig_image_scanner.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ impl SysdigImageScanner {
124124
impl ImageScanner for SysdigImageScanner {
125125
async fn scan_image(&self, image_pull_string: &str) -> Result<ScanResult, ImageScanError> {
126126
let scan = self.scan(image_pull_string).await?;
127-
Ok(ScanResult::from(&scan))
127+
Ok(ScanResult::from(scan))
128128
}
129129
}
130130

src/infra/sysdig_image_scanner_json_scan_result_v1.rs

Lines changed: 78 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use crate::domain::scanresult::{
1515
severity::Severity,
1616
};
1717

18-
impl From<&JsonScanResultV1> for ScanResult {
19-
fn from(report: &JsonScanResultV1) -> Self {
18+
impl From<JsonScanResultV1> for ScanResult {
19+
fn from(report: JsonScanResultV1) -> Self {
2020
let mut scan_result = ScanResult::from(&report.result.metadata);
2121

2222
add_layers(&report.result, &mut scan_result);
@@ -225,20 +225,20 @@ fn arch_from_str(string: &str) -> Architecture {
225225
}
226226
}
227227

228-
#[derive(Debug, Deserialize)]
228+
#[derive(Debug, Deserialize, Clone)]
229229
pub(super) struct JsonScanResultV1 {
230230
pub info: JsonInfo,
231231
pub scanner: JsonScanner,
232232
pub result: JsonResult,
233233
}
234234

235-
#[derive(Debug, Deserialize)]
235+
#[derive(Debug, Deserialize, Clone)]
236236
pub(super) struct JsonScanner {
237237
pub name: String,
238238
pub version: String,
239239
}
240240

241-
#[derive(Debug, Deserialize)]
241+
#[derive(Debug, Deserialize, Clone)]
242242
pub(super) struct JsonInfo {
243243
#[serde(rename = "scanTime")]
244244
pub scan_time: DateTime<Utc>,
@@ -283,7 +283,7 @@ pub enum ImageMetadataArchitecture {
283283
}
284284

285285
#[derive(Debug, Deserialize, PartialEq, Eq, Hash, Clone)]
286-
#[serde(rename_all = "camelCase")]
286+
#[serde(rename_all = "lowercase")]
287287
pub enum JsonSeverity {
288288
Critical,
289289
High,
@@ -304,7 +304,7 @@ impl From<JsonSeverity> for Severity {
304304
}
305305
}
306306

307-
#[derive(Debug, Deserialize)]
307+
#[derive(Debug, Deserialize, Clone)]
308308
pub(super) struct JsonBundle {
309309
#[serde(rename = "identifier", default)]
310310
pub identifier: String,
@@ -316,15 +316,15 @@ pub(super) struct JsonBundle {
316316
pub bundle_type: String,
317317
}
318318

319-
#[derive(Debug, Deserialize)]
319+
#[derive(Debug, Deserialize, Clone)]
320320
pub(super) struct JsonCvssScore {
321321
pub score: f32,
322322
#[serde(default)] // FIXME(fede): test this
323323
pub vector: String,
324324
pub version: String,
325325
}
326326

327-
#[derive(Debug, Deserialize)]
327+
#[derive(Debug, Deserialize, Clone)]
328328
pub(super) struct JsonLayer {
329329
#[serde(rename = "command", default)]
330330
pub command: Option<String>,
@@ -336,7 +336,7 @@ pub(super) struct JsonLayer {
336336
pub size: Option<u64>,
337337
}
338338

339-
#[derive(Debug, Deserialize)]
339+
#[derive(Debug, Deserialize, Clone)]
340340
pub(super) struct JsonPackage {
341341
#[serde(rename = "isRemoved", default)]
342342
pub is_removed: bool,
@@ -400,15 +400,15 @@ impl From<JsonPackageType> for PackageType {
400400
}
401401
}
402402

403-
#[derive(Debug, Deserialize, Default)]
403+
#[derive(Debug, Deserialize, Default, Clone)]
404404
pub(super) struct JsonPolicies {
405405
#[serde(rename = "globalEvaluation", default)]
406406
pub global_evaluation: String,
407407
#[serde(rename = "evaluations", default)]
408408
pub evaluations: Option<Vec<JsonPolicy>>,
409409
}
410410

411-
#[derive(Debug, Deserialize)]
411+
#[derive(Debug, Deserialize, Clone)]
412412
pub(super) struct JsonPolicy {
413413
#[serde(rename = "bundles", default)]
414414
pub bundles: Option<Vec<JsonBundle>>,
@@ -426,13 +426,13 @@ pub(super) struct JsonPolicy {
426426
pub updated_at: DateTime<Utc>,
427427
}
428428

429-
#[derive(Debug, Deserialize, Default)]
429+
#[derive(Debug, Deserialize, Default, Clone)]
430430
pub(super) struct JsonProducer {
431431
#[serde(rename = "producedAt", default)]
432432
pub produced_at: DateTime<Utc>,
433433
}
434434

435-
#[derive(Debug, Deserialize)]
435+
#[derive(Debug, Deserialize, Clone)]
436436
pub(super) struct JsonRiskAccept {
437437
#[serde(rename = "createdAt")]
438438
pub created_at: DateTime<Utc>,
@@ -479,7 +479,7 @@ impl From<JsonRiskAcceptReason> for AcceptedRiskReason {
479479
}
480480
}
481481
}
482-
#[derive(Debug, Deserialize)]
482+
#[derive(Debug, Deserialize, Clone)]
483483
pub(super) struct JsonRule {
484484
#[serde(rename = "description")]
485485
pub description: String,
@@ -495,7 +495,7 @@ pub(super) struct JsonRule {
495495
pub rule_type: String,
496496
}
497497

498-
#[derive(Debug, Deserialize)]
498+
#[derive(Debug, Deserialize, Clone)]
499499
pub(super) struct JsonFailure {
500500
#[serde(rename = "remediation", default)]
501501
pub remediation: String,
@@ -505,7 +505,7 @@ pub(super) struct JsonFailure {
505505
pub vulnerability_ref: String,
506506
}
507507

508-
#[derive(Debug, Deserialize)]
508+
#[derive(Debug, Deserialize, Clone)]
509509
pub(super) struct JsonResult {
510510
#[serde(rename = "assetType")]
511511
pub asset_type: String,
@@ -527,7 +527,7 @@ pub(super) struct JsonResult {
527527
pub vulnerabilities: HashMap<String, JsonVulnerability>,
528528
}
529529

530-
#[derive(Debug, Deserialize)]
530+
#[derive(Debug, Deserialize, Clone)]
531531
pub(super) struct JsonMetadata {
532532
#[serde(rename = "architecture")]
533533
pub architecture: String,
@@ -551,7 +551,7 @@ pub(super) struct JsonMetadata {
551551
pub size: u64,
552552
}
553553

554-
#[derive(Debug, Deserialize)]
554+
#[derive(Debug, Deserialize, Clone)]
555555
pub(super) struct JsonVulnerability {
556556
#[serde(rename = "cvssScore")]
557557
pub cvss_score: JsonCvssScore,
@@ -574,3 +574,62 @@ pub(super) struct JsonVulnerability {
574574
#[serde(rename = "solutionDate", default)]
575575
pub solution_date: Option<NaiveDate>,
576576
}
577+
578+
#[cfg(test)]
579+
mod tests {
580+
use crate::{
581+
domain::scanresult::{scan_result::ScanResult, severity::Severity},
582+
infra::sysdig_image_scanner_json_scan_result_v1::JsonScanResultV1,
583+
};
584+
585+
#[test]
586+
fn it_loads_postgres13() {
587+
let postgres_13_json = include_bytes!("../../tests/fixtures/scan-results/postgres_13.json");
588+
let json_scan_result: JsonScanResultV1 = serde_json::from_slice(postgres_13_json).unwrap();
589+
590+
let scan_result: ScanResult = json_scan_result.clone().into();
591+
592+
assert_eq!(json_scan_result.result.vulnerabilities.len(), 100);
593+
assert_eq!(
594+
scan_result
595+
.vulnerabilities()
596+
.iter()
597+
.filter(|v| v.severity() == Severity::Critical)
598+
.count(),
599+
2
600+
);
601+
assert_eq!(
602+
scan_result
603+
.vulnerabilities()
604+
.iter()
605+
.filter(|v| v.severity() == Severity::High)
606+
.count(),
607+
3
608+
);
609+
assert_eq!(
610+
scan_result
611+
.vulnerabilities()
612+
.iter()
613+
.filter(|v| v.severity() == Severity::Medium)
614+
.count(),
615+
1
616+
);
617+
assert_eq!(
618+
scan_result
619+
.vulnerabilities()
620+
.iter()
621+
.filter(|v| v.severity() == Severity::Low)
622+
.count(),
623+
2
624+
);
625+
assert_eq!(
626+
scan_result
627+
.vulnerabilities()
628+
.iter()
629+
.filter(|v| v.severity() == Severity::Negligible)
630+
.count(),
631+
32
632+
);
633+
// assert_eq!(scan_result.vulnerabilities().len(), 97);
634+
}
635+
}

0 commit comments

Comments
 (0)