forked from containerd/rust-extensions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathttrpc-server.rs
82 lines (68 loc) · 2.18 KB
/
ttrpc-server.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright (c) 2019 Ant Financial
// Copyright (c) 2021 Ant Group
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::{sync::Arc, thread};
use containerd_shim_protos::{
api::{CreateTaskRequest, CreateTaskResponse},
create_task, Task,
};
use ttrpc::Server;
#[derive(Debug, PartialEq)]
struct FakeServer {
magic: u32,
}
impl FakeServer {
fn new() -> Self {
FakeServer { magic: 0xadcbdacf }
}
}
impl Task for FakeServer {
fn create(
&self,
ctx: &::ttrpc::TtrpcContext,
req: CreateTaskRequest,
) -> ::ttrpc::Result<CreateTaskResponse> {
let mut resp = CreateTaskResponse::default();
let md = &ctx.metadata;
let v1 = md.get("key-1").unwrap();
let v2 = md.get("key-2").unwrap();
assert_eq!(v1[0], "value-1-1");
assert_eq!(v1[1], "value-1-2");
assert_eq!(v2[0], "value-2");
assert_eq!(&req.id, "id1");
resp.set_pid(0x10c0);
Ok(resp)
}
}
fn main() {
simple_logger::SimpleLogger::new().init().unwrap();
let t = Box::new(FakeServer::new()) as Box<dyn Task + Send + Sync>;
let t = Arc::new(t);
let tservice = create_task(t);
let mut server = Server::new()
.bind("unix:///tmp/shim-proto-ttrpc-001")
.unwrap()
.register_service(tservice);
server.start().unwrap();
// Hold the main thread until receiving signal SIGTERM
let (tx, rx) = std::sync::mpsc::channel();
thread::spawn(move || {
ctrlc::set_handler(move || {
tx.send(()).unwrap();
})
.expect("Error setting Ctrl-C handler");
println!("Server is running, press Ctrl + C to exit");
});
rx.recv().unwrap();
}