Skip to content

Commit 5884fcd

Browse files
committed
Add session_id handling and NodeMetrics
1 parent 01f6834 commit 5884fcd

7 files changed

Lines changed: 364 additions & 28 deletions

File tree

crates/sandchest-agent/src/service.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ impl GuestAgent for GuestAgentService {
5757
let req = request.into_inner();
5858
let session_id = self
5959
.session_manager
60-
.create_session(&req.shell, &req.env)
60+
.create_session(&req.session_id, &req.shell, &req.env)
6161
.await?;
6262
Ok(Response::new(SessionResponse { session_id }))
6363
}

crates/sandchest-agent/src/session.rs

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ impl SessionManager {
5757

5858
pub async fn create_session(
5959
&self,
60+
requested_session_id: &str,
6061
shell: &str,
6162
env: &HashMap<String, String>,
6263
) -> Result<String, Status> {
@@ -71,19 +72,25 @@ impl SessionManager {
7172
let shell = if shell.is_empty() { "/bin/bash" } else { shell };
7273
let (master_fd, child_pid) = spawn_shell(shell, env)?;
7374

74-
let id_num = self.next_id.fetch_add(1, Ordering::Relaxed);
75-
let session_id = format!("sess_{id_num:04}");
75+
let session_id = if requested_session_id.is_empty() {
76+
let id_num = self.next_id.fetch_add(1, Ordering::Relaxed);
77+
format!("sess_{id_num:04}")
78+
} else {
79+
requested_session_id.to_string()
80+
};
7681

7782
let session = Arc::new(Session {
7883
master_fd: RawFdWrapper { fd: master_fd },
7984
child_pid,
8085
exec_lock: Mutex::new(()),
8186
});
8287

83-
self.sessions
84-
.write()
85-
.await
86-
.insert(session_id.clone(), session);
88+
let replaced = self.sessions.write().await.insert(session_id.clone(), session);
89+
if replaced.is_some() {
90+
return Err(Status::already_exists(format!(
91+
"session {session_id} already exists"
92+
)));
93+
}
8794

8895
debug!(session_id, child_pid, shell, "created session");
8996
Ok(session_id)
@@ -668,7 +675,10 @@ mod tests {
668675
async fn session_manager_create_and_destroy() {
669676
let manager = SessionManager::new();
670677
let env = HashMap::new();
671-
let session_id = manager.create_session("/bin/sh", &env).await.unwrap();
678+
let session_id = manager
679+
.create_session("sess_test_1", "/bin/sh", &env)
680+
.await
681+
.unwrap();
672682
assert!(session_id.starts_with("sess_"));
673683

674684
// Session should be accessible
@@ -686,8 +696,14 @@ mod tests {
686696
let manager = SessionManager::new();
687697
let env = HashMap::new();
688698

689-
let id1 = manager.create_session("/bin/sh", &env).await.unwrap();
690-
let id2 = manager.create_session("/bin/sh", &env).await.unwrap();
699+
let id1 = manager
700+
.create_session("sess_test_1", "/bin/sh", &env)
701+
.await
702+
.unwrap();
703+
let id2 = manager
704+
.create_session("sess_test_2", "/bin/sh", &env)
705+
.await
706+
.unwrap();
691707
assert_ne!(id1, id2);
692708

693709
manager.destroy_session(&id1).await.unwrap();
@@ -701,12 +717,15 @@ mod tests {
701717

702718
let mut ids = Vec::new();
703719
for _ in 0..MAX_SESSIONS {
704-
let id = manager.create_session("/bin/sh", &env).await.unwrap();
720+
let id = manager
721+
.create_session("", "/bin/sh", &env)
722+
.await
723+
.unwrap();
705724
ids.push(id);
706725
}
707726

708727
// Next session should fail with resource exhausted
709-
let result = manager.create_session("/bin/sh", &env).await;
728+
let result = manager.create_session("", "/bin/sh", &env).await;
710729
assert!(result.is_err());
711730
assert_eq!(result.unwrap_err().code(), tonic::Code::ResourceExhausted);
712731

@@ -721,7 +740,7 @@ mod tests {
721740
let manager = SessionManager::new();
722741
let env = HashMap::new();
723742
// Empty shell should default to /bin/bash
724-
let id = manager.create_session("", &env).await.unwrap();
743+
let id = manager.create_session("", "", &env).await.unwrap();
725744
assert!(id.starts_with("sess_"));
726745
manager.destroy_session(&id).await.unwrap();
727746
}
@@ -731,8 +750,8 @@ mod tests {
731750
let manager = SessionManager::new();
732751
let env = HashMap::new();
733752

734-
manager.create_session("/bin/sh", &env).await.unwrap();
735-
manager.create_session("/bin/sh", &env).await.unwrap();
753+
manager.create_session("sess_test_1", "/bin/sh", &env).await.unwrap();
754+
manager.create_session("sess_test_2", "/bin/sh", &env).await.unwrap();
736755

737756
manager.destroy_all().await;
738757

@@ -746,7 +765,7 @@ mod tests {
746765
let manager = SessionManager::new();
747766
let env = HashMap::new();
748767
let result = manager
749-
.create_session("/nonexistent/shell", &env)
768+
.create_session("", "/nonexistent/shell", &env)
750769
.await;
751770
assert!(result.is_err());
752771
}

crates/sandchest-agent/src/snapshot.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,14 @@ mod tests {
343343
let env = HashMap::new();
344344

345345
// Create some sessions
346-
let id1 = manager.create_session("/bin/sh", &env).await.unwrap();
347-
let id2 = manager.create_session("/bin/sh", &env).await.unwrap();
346+
let id1 = manager
347+
.create_session("sess_test_1", "/bin/sh", &env)
348+
.await
349+
.unwrap();
350+
let id2 = manager
351+
.create_session("sess_test_2", "/bin/sh", &env)
352+
.await
353+
.unwrap();
348354
assert!(manager.session_count().await > 0);
349355

350356
// Run fork recovery

crates/sandchest-node/src/router.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ pub fn to_agent_exec_request(req: proto::NodeExecRequest) -> agent_proto::ExecRe
9494

9595
pub fn to_agent_create_session(req: proto::NodeCreateSessionRequest) -> agent_proto::CreateSessionRequest {
9696
agent_proto::CreateSessionRequest {
97+
session_id: req.session_id,
9798
shell: req.shell,
9899
env: req.env,
99100
}
@@ -280,6 +281,7 @@ mod tests {
280281
};
281282

282283
let agent_req = to_agent_create_session(node_req);
284+
assert_eq!(agent_req.session_id, "sess_abc");
283285
assert_eq!(agent_req.shell, "/bin/bash");
284286
assert_eq!(agent_req.env.get("TERM").unwrap(), "xterm");
285287
}

packages/contract/proto/sandchest/agent/v1/agent.proto

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@ message ExitEvent {
4949
}
5050

5151
message CreateSessionRequest {
52-
string shell = 1;
53-
map<string, string> env = 2;
52+
string session_id = 1;
53+
string shell = 2;
54+
map<string, string> env = 3;
5455
}
5556

5657
message SessionResponse {

packages/contract/src/generated/sandchest/agent/v1/agent.ts

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

0 commit comments

Comments
 (0)