Skip to content

Commit e1b2d9f

Browse files
committed
trustee: Add unit tests
Tested functions: - sync_all_machine_luks_key - update_attestation_keys Signed-off-by: Roy Kaufman <rkaufman@redhat.com>
1 parent 7bfa539 commit e1b2d9f

3 files changed

Lines changed: 193 additions & 8 deletions

File tree

Cargo.lock

Lines changed: 39 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

operator/src/test_utils.rs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22
//
33
// SPDX-License-Identifier: MIT
44

5+
use crate::trustee;
56
use compute_pcrs_lib::Pcr;
7+
use k8s_openapi::apimachinery::pkg::apis::meta::v1::OwnerReference;
68
use k8s_openapi::{
79
api::core::v1::{ConfigMap, Secret},
810
jiff::Timestamp,
911
};
12+
use kube::api::ObjectMeta;
1013
use std::collections::BTreeMap;
11-
12-
use crate::trustee;
1314
use trusted_cluster_operator_lib::reference_values::{ImagePcr, ImagePcrs, PCR_CONFIG_FILE};
15+
use trusted_cluster_operator_lib::{Machine, MachineSpec};
1416

1517
pub fn dummy_pcrs() -> ImagePcrs {
1618
ImagePcrs(BTreeMap::from([(
@@ -74,3 +76,34 @@ pub fn dummy_pcrs_map() -> ConfigMap {
7476
..Default::default()
7577
}
7678
}
79+
80+
pub fn dummy_machine(id: &str) -> Machine {
81+
Machine {
82+
metadata: ObjectMeta {
83+
name: Some(id.to_string()),
84+
..Default::default()
85+
},
86+
spec: MachineSpec { id: id.to_string() },
87+
status: None,
88+
}
89+
}
90+
91+
pub fn dummy_ak_secret(name: &str) -> Secret {
92+
Secret {
93+
metadata: ObjectMeta {
94+
name: Some(name.to_string()),
95+
owner_references: Some(vec![OwnerReference {
96+
kind: "AttestationKey".to_string(),
97+
name: name.to_string(),
98+
uid: "ak-uid".to_string(),
99+
..Default::default()
100+
}]),
101+
..Default::default()
102+
},
103+
data: Some(BTreeMap::from([(
104+
"public_key".to_string(),
105+
k8s_openapi::ByteString(b"test-ak-public-key".to_vec()),
106+
)])),
107+
..Default::default()
108+
}
109+
}

operator/src/trustee.rs

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,7 @@ mod tests {
702702
use super::*;
703703
use crate::test_utils::*;
704704
use http::{Method, Request, StatusCode};
705+
use k8s_openapi::apimachinery::pkg::apis::meta::v1::Time;
705706
use trusted_cluster_operator_test_utils::mock_client::*;
706707
use trusted_cluster_operator_test_utils::test_error_method;
707708

@@ -932,4 +933,122 @@ mod tests {
932933
assert_eq!(rv.version, "0.1.0");
933934
}
934935
}
936+
937+
#[tokio::test]
938+
async fn test_sync_all_machine_luks_key_empty() {
939+
let clos = async |req: Request<_>, ctr| match (ctr, req.method()) {
940+
(0, &Method::GET) => {
941+
let list = kube::api::ObjectList {
942+
items: Vec::<Machine>::new(),
943+
types: Default::default(),
944+
metadata: Default::default(),
945+
};
946+
Ok(serde_json::to_string(&list).unwrap())
947+
}
948+
_ => panic!("unexpected API interaction: {req:?}, counter {ctr}"),
949+
};
950+
count_check!(1, clos, |client| {
951+
assert!(sync_all_machine_luks_key(client).await.is_ok());
952+
});
953+
}
954+
955+
#[tokio::test]
956+
async fn test_sync_all_machine_luks_key_send_error() {
957+
let clos = async |req: Request<_>, ctr| match (ctr, req.method()) {
958+
(0, &Method::GET) => {
959+
let list = kube::api::ObjectList {
960+
items: vec![dummy_machine("m1")],
961+
types: Default::default(),
962+
metadata: Default::default(),
963+
};
964+
Ok(serde_json::to_string(&list).unwrap())
965+
}
966+
(_, &Method::GET) => Err(StatusCode::NOT_FOUND),
967+
_ => panic!("unexpected API interaction: {req:?}, counter {ctr}"),
968+
};
969+
count_check!(2, clos, |client| {
970+
assert!(sync_all_machine_luks_key(client).await.is_err());
971+
});
972+
}
973+
974+
#[tokio::test]
975+
async fn test_update_attestation_keys_empty() {
976+
let clos = async |_, ctr| match ctr {
977+
0 => {
978+
let list = kube::api::ObjectList {
979+
items: Vec::<Secret>::new(),
980+
types: Default::default(),
981+
metadata: Default::default(),
982+
};
983+
Ok(serde_json::to_string(&list).unwrap())
984+
}
985+
_ => Err(StatusCode::NOT_FOUND),
986+
};
987+
count_check!(2, clos, |client| {
988+
assert!(update_attestation_keys(client).await.is_ok());
989+
});
990+
}
991+
992+
#[tokio::test]
993+
async fn test_update_attestation_keys_register_fails_gracefully() {
994+
let clos = async |_, ctr| match ctr {
995+
0 => {
996+
let list = kube::api::ObjectList {
997+
items: vec![dummy_ak_secret("ak1"), dummy_ak_secret("ak2")],
998+
types: Default::default(),
999+
metadata: Default::default(),
1000+
};
1001+
Ok(serde_json::to_string(&list).unwrap())
1002+
}
1003+
_ => Err(StatusCode::NOT_FOUND),
1004+
};
1005+
count_check!(2, clos, |client| {
1006+
assert!(update_attestation_keys(client).await.is_ok());
1007+
});
1008+
}
1009+
1010+
#[tokio::test]
1011+
async fn test_update_attestation_keys_register_success() {
1012+
let _ = jsonwebtoken_openssl::install_default();
1013+
let clos = async |req: Request<_>, ctr| match (ctr, req.method()) {
1014+
(0, &Method::GET) => {
1015+
let list = kube::api::ObjectList {
1016+
items: vec![dummy_ak_secret("ak1")],
1017+
types: Default::default(),
1018+
metadata: Default::default(),
1019+
};
1020+
Ok(serde_json::to_string(&list).unwrap())
1021+
}
1022+
(1, &Method::GET) => {
1023+
assert!(req.uri().path().contains(TRUSTEE_AUTH_SECRET));
1024+
Ok(serde_json::to_string(&dummy_trustee_auth()).unwrap())
1025+
}
1026+
(2, &Method::GET) => Ok(serde_json::to_string(&dummy_cluster()).unwrap()),
1027+
_ => panic!("unexpected API interaction: {req:?}, counter {ctr}"),
1028+
};
1029+
count_check!(3, clos, |client| {
1030+
assert!(update_attestation_keys(client).await.is_ok());
1031+
});
1032+
}
1033+
1034+
#[tokio::test]
1035+
async fn test_update_attestation_keys_filters_deleting() {
1036+
let clos = async |_, ctr| match ctr {
1037+
0 => {
1038+
let mut deleting = dummy_ak_secret("ak-deleting");
1039+
deleting.metadata.deletion_timestamp =
1040+
Some(Time(k8s_openapi::jiff::Timestamp::now()));
1041+
let list = kube::api::ObjectList {
1042+
items: vec![deleting],
1043+
types: Default::default(),
1044+
metadata: Default::default(),
1045+
};
1046+
Ok(serde_json::to_string(&list).unwrap())
1047+
}
1048+
_ => Err(StatusCode::NOT_FOUND),
1049+
};
1050+
count_check!(2, clos, |client| {
1051+
assert!(update_attestation_keys(client).await.is_ok());
1052+
});
1053+
}
9351054
}

0 commit comments

Comments
 (0)