Source commit: a43e907efd9d1561c23fe73499478e881f868355 Public tree identity: sha256:453dea30195485dd8939f575a69b39f4bb7acd84c4df23f8aa29b55d044f2673
111 lines
4.3 KiB
Rust
111 lines
4.3 KiB
Rust
use std::path::PathBuf;
|
|
|
|
use anyhow::Result;
|
|
use serde_json::{json, Value};
|
|
|
|
use crate::client::{
|
|
authenticated_or_local_trusted_request, list_attached_nodes_if_available_with_session,
|
|
list_task_events_if_available_with_session, stored_session_for_coordinator, JsonLineSession,
|
|
};
|
|
use crate::config::{effective_project_scope, read_cli_session, read_project_config};
|
|
use crate::process_events::{quota_current_usage, quota_limits_value, quota_next_blocked_action};
|
|
use crate::QuotaStatusArgs;
|
|
|
|
pub(crate) fn quota_status_report(args: QuotaStatusArgs, cwd: PathBuf) -> Result<Value> {
|
|
let config = read_project_config(&cwd)?;
|
|
let stored_session = read_cli_session(&cwd)?;
|
|
let mut effective_scope = effective_project_scope(&args.scope, config.as_ref());
|
|
if effective_scope.coordinator.is_none() {
|
|
effective_scope.coordinator = stored_session
|
|
.as_ref()
|
|
.filter(|session| session.session_secret.is_some())
|
|
.map(|session| session.coordinator.clone());
|
|
}
|
|
if let Some(bound_session) = effective_scope
|
|
.coordinator
|
|
.as_deref()
|
|
.and_then(|coordinator| {
|
|
stored_session_for_coordinator(coordinator, stored_session.as_ref())
|
|
})
|
|
{
|
|
effective_scope.tenant = bound_session.tenant.clone();
|
|
effective_scope.project = bound_session.project.clone();
|
|
effective_scope.user = bound_session.user.clone();
|
|
}
|
|
let coordinator = effective_scope.coordinator.clone();
|
|
let attached_nodes = list_attached_nodes_if_available_with_session(
|
|
coordinator.as_deref(),
|
|
&effective_scope,
|
|
stored_session.as_ref(),
|
|
)?;
|
|
let task_events = list_task_events_if_available_with_session(
|
|
coordinator.as_deref(),
|
|
&effective_scope,
|
|
None,
|
|
stored_session.as_ref(),
|
|
)?;
|
|
let quota_status = if let Some(coordinator) = coordinator.as_deref() {
|
|
let mut session = JsonLineSession::connect(coordinator)?;
|
|
Some(session.request(authenticated_or_local_trusted_request(
|
|
coordinator,
|
|
stored_session.as_ref(),
|
|
json!({ "type": "quota_status" }),
|
|
json!({
|
|
"type": "quota_status",
|
|
"tenant": effective_scope.tenant,
|
|
"project": effective_scope.project,
|
|
"actor_user": effective_scope.user,
|
|
}),
|
|
)?)?)
|
|
} else {
|
|
None
|
|
};
|
|
let mut current_usage = quota_current_usage(&attached_nodes, task_events.as_ref());
|
|
if let (Some(object), Some(status)) = (current_usage.as_object_mut(), quota_status.as_ref()) {
|
|
object.insert(
|
|
"scoped_resource_usage".to_owned(),
|
|
status.get("usage").cloned().unwrap_or(Value::Null),
|
|
);
|
|
object.insert(
|
|
"window_started_epoch_seconds".to_owned(),
|
|
status
|
|
.get("window_started_epoch_seconds")
|
|
.cloned()
|
|
.unwrap_or(Value::Null),
|
|
);
|
|
}
|
|
let limits = quota_status
|
|
.as_ref()
|
|
.and_then(|status| status.pointer("/limits/limits"))
|
|
.cloned()
|
|
.unwrap_or_else(quota_limits_value);
|
|
let window_seconds = quota_status
|
|
.as_ref()
|
|
.and_then(|status| status.get("window_seconds"))
|
|
.cloned()
|
|
.unwrap_or(Value::Null);
|
|
let quota_tier = quota_status
|
|
.as_ref()
|
|
.and_then(|status| status.get("policy_label"))
|
|
.cloned()
|
|
.unwrap_or(Value::Null);
|
|
Ok(json!({
|
|
"command": "quota status",
|
|
"tenant": effective_scope.tenant,
|
|
"project": effective_scope.project,
|
|
"user": effective_scope.user,
|
|
"coordinator": coordinator,
|
|
"project_config": config,
|
|
"policy_surface": "generic public quota categories; hosted tuning remains private policy",
|
|
"limits": limits,
|
|
"window_seconds": window_seconds,
|
|
"current_usage": current_usage,
|
|
"attached_nodes": attached_nodes,
|
|
"task_events": task_events,
|
|
"next_blocked_action": quota_next_blocked_action(¤t_usage),
|
|
"quota_configuration_source": if quota_status.is_some() { "coordinator" } else { "unavailable_offline" },
|
|
"quota_tier": quota_tier,
|
|
"private_abuse_heuristics_exposed": false,
|
|
"quota_response": quota_status,
|
|
}))
|
|
}
|