Public dry run dryrun-1bb23a07ddd0

Source commit: 1bb23a07ddd082b491fd20b9be7bd7a6f9c46916

Public tree identity: sha256:098417c1f41d9acc1149ce03c1b86e63bb5a13a9932a15beaedef5c21078f140
This commit is contained in:
Michel Paulissen 2026-07-03 20:59:56 +02:00
parent 9f2d6ec010
commit a40778221a
6 changed files with 294 additions and 3 deletions

View file

@ -1153,15 +1153,36 @@ fn node_descriptors_report(
fn node_revoke_report(args: NodeRevokeArgs) -> Result<Value> {
if let Some(coordinator) = &args.scope.coordinator {
let tenant = args.scope.tenant.clone();
let project = args.scope.project.clone();
let user = args.scope.user.clone();
let node = args.node.clone();
let mut session = JsonLineSession::connect(coordinator)?;
let response = session.request(json!({
"type": "revoke_node_credential",
"node": args.node,
"tenant": tenant,
"project": project,
"actor_user": user,
"node": node,
}))?;
return Ok(json!({
"command": "node revoke",
"coordinator": coordinator,
"requires_confirmation": !args.yes,
"tenant": tenant,
"project": project,
"user": user,
"node": node,
"credential_revoked": response.get("type").and_then(Value::as_str) == Some("node_credential_revoked"),
"descriptor_removed": response
.get("descriptor_removed")
.cloned()
.unwrap_or_else(|| json!(false)),
"queued_assignments_removed": response
.get("queued_assignments_removed")
.cloned()
.unwrap_or_else(|| json!(0)),
"node_credentials_separate_from_user_session": true,
"response": response,
"coordinator_session_requests": session.requests(),
}));
@ -4436,6 +4457,50 @@ mod tests {
assert_eq!(revoked["attribution"]["revoked_by_user"], "user");
}
#[test]
fn node_revoke_reports_scoped_credential_revocation() {
let listener = TcpListener::bind("127.0.0.1:0").unwrap();
let addr = listener.local_addr().unwrap().to_string();
let server = std::thread::spawn(move || {
let (mut stream, _) = listener.accept().unwrap();
let mut reader = BufReader::new(stream.try_clone().unwrap());
let mut line = String::new();
reader.read_line(&mut line).unwrap();
assert!(line.contains(r#""type":"revoke_node_credential""#));
assert!(line.contains(r#""tenant":"tenant""#));
assert!(line.contains(r#""project":"project""#));
assert!(line.contains(r#""actor_user":"user""#));
assert!(line.contains(r#""node":"node-a""#));
stream
.write_all(
br#"{"type":"node_credential_revoked","node":"node-a","tenant":"tenant","project":"project","actor":"user","descriptor_removed":true,"queued_assignments_removed":2}"#,
)
.unwrap();
stream.write_all(b"\n").unwrap();
});
let revoked = node_revoke_report(NodeRevokeArgs {
scope: CliScopeArgs {
coordinator: Some(addr),
tenant: "tenant".to_owned(),
project: "project".to_owned(),
user: "user".to_owned(),
json: false,
},
node: "node-a".to_owned(),
yes: true,
})
.unwrap();
server.join().unwrap();
assert_eq!(revoked["command"], "node revoke");
assert_eq!(revoked["node"], "node-a");
assert_eq!(revoked["credential_revoked"], true);
assert_eq!(revoked["descriptor_removed"], true);
assert_eq!(revoked["queued_assignments_removed"], 2);
assert_eq!(revoked["node_credentials_separate_from_user_session"], true);
}
#[test]
fn human_report_is_text_not_json() {
let report = json!({