feat(runc-shim): add a version flag
Signed-off-by: jiaxiao zhou <jiazho@microsoft.com>
This commit is contained in:
parent
a5a29fc82a
commit
deea90ff83
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
Copyright The containerd Authors.
|
||||||
|
|
||||||
|
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::{process::Command, str::from_utf8};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let output = match Command::new("git").arg("rev-parse").arg("HEAD").output() {
|
||||||
|
Ok(output) => output,
|
||||||
|
Err(_) => {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let mut hash = from_utf8(&output.stdout).unwrap().trim().to_string();
|
||||||
|
|
||||||
|
let output_dirty = match Command::new("git").arg("diff").arg("--exit-code").output() {
|
||||||
|
Ok(output) => output,
|
||||||
|
Err(_) => {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if !output_dirty.status.success() {
|
||||||
|
hash.push_str(".m");
|
||||||
|
}
|
||||||
|
println!("cargo:rustc-env=CARGO_GIT_HASH={}", hash);
|
||||||
|
}
|
||||||
|
|
@ -14,7 +14,9 @@
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use containerd_shim::asynchronous::run;
|
use std::env;
|
||||||
|
|
||||||
|
use containerd_shim::{asynchronous::run, parse};
|
||||||
|
|
||||||
mod common;
|
mod common;
|
||||||
mod console;
|
mod console;
|
||||||
|
|
@ -27,7 +29,21 @@ mod task;
|
||||||
|
|
||||||
use service::Service;
|
use service::Service;
|
||||||
|
|
||||||
|
fn parse_version() {
|
||||||
|
let os_args: Vec<_> = env::args_os().collect();
|
||||||
|
let flags = parse(&os_args[1..]).unwrap();
|
||||||
|
if flags.version {
|
||||||
|
println!("{}:", os_args[0].to_string_lossy());
|
||||||
|
println!(" Version: {}", env!("CARGO_PKG_VERSION"));
|
||||||
|
println!(" Revision: {}", env!("CARGO_GIT_HASH"));
|
||||||
|
println!();
|
||||||
|
|
||||||
|
std::process::exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
|
parse_version();
|
||||||
run::<Service>("io.containerd.runc.v2-rs", None).await;
|
run::<Service>("io.containerd.runc.v2-rs", None).await;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,15 +39,17 @@ pub struct Flags {
|
||||||
/// Shim action (start / delete).
|
/// Shim action (start / delete).
|
||||||
/// See <https://github.com/containerd/containerd/blob/master/runtime/v2/shim/shim.go#L191>
|
/// See <https://github.com/containerd/containerd/blob/master/runtime/v2/shim/shim.go#L191>
|
||||||
pub action: String,
|
pub action: String,
|
||||||
|
/// Version of the shim.
|
||||||
|
pub version: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses command line arguments passed to the shim.
|
/// Parses command line arguments passed to the shim.
|
||||||
/// This func replicates https://github.com/containerd/containerd/blob/master/runtime/v2/shim/shim.go#L110
|
|
||||||
pub fn parse<S: AsRef<OsStr>>(args: &[S]) -> Result<Flags> {
|
pub fn parse<S: AsRef<OsStr>>(args: &[S]) -> Result<Flags> {
|
||||||
let mut flags = Flags::default();
|
let mut flags = Flags::default();
|
||||||
|
|
||||||
let args: Vec<String> = go_flag::parse_args(args, |f| {
|
let args: Vec<String> = go_flag::parse_args(args, |f| {
|
||||||
f.add_flag("debug", &mut flags.debug);
|
f.add_flag("debug", &mut flags.debug);
|
||||||
|
f.add_flag("v", &mut flags.version);
|
||||||
f.add_flag("namespace", &mut flags.namespace);
|
f.add_flag("namespace", &mut flags.namespace);
|
||||||
f.add_flag("id", &mut flags.id);
|
f.add_flag("id", &mut flags.id);
|
||||||
f.add_flag("socket", &mut flags.socket);
|
f.add_flag("socket", &mut flags.socket);
|
||||||
|
|
@ -61,12 +63,6 @@ pub fn parse<S: AsRef<OsStr>>(args: &[S]) -> Result<Flags> {
|
||||||
flags.action = action.into();
|
flags.action = action.into();
|
||||||
}
|
}
|
||||||
|
|
||||||
if flags.namespace.is_empty() {
|
|
||||||
return Err(Error::InvalidArgument(String::from(
|
|
||||||
"Shim namespace cannot be empty",
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(flags)
|
Ok(flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -125,11 +121,4 @@ mod tests {
|
||||||
assert_eq!(flags.action, "start");
|
assert_eq!(flags.action, "start");
|
||||||
assert_eq!(flags.id, "");
|
assert_eq!(flags.id, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn no_namespace() {
|
|
||||||
let empty: [String; 0] = [];
|
|
||||||
let result = parse(&empty).err();
|
|
||||||
assert!(result.is_some())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ pub use crate::synchronous::*;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
|
|
||||||
mod args;
|
mod args;
|
||||||
pub use args::Flags;
|
pub use args::{parse, Flags};
|
||||||
#[cfg(feature = "async")]
|
#[cfg(feature = "async")]
|
||||||
pub mod asynchronous;
|
pub mod asynchronous;
|
||||||
pub mod cgroup;
|
pub mod cgroup;
|
||||||
|
|
|
||||||
|
|
@ -201,6 +201,12 @@ where
|
||||||
let os_args: Vec<_> = env::args_os().collect();
|
let os_args: Vec<_> = env::args_os().collect();
|
||||||
let flags = args::parse(&os_args[1..])?;
|
let flags = args::parse(&os_args[1..])?;
|
||||||
|
|
||||||
|
if flags.namespace.is_empty() {
|
||||||
|
return Err(Error::InvalidArgument(String::from(
|
||||||
|
"Shim namespace cannot be empty",
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
let ttrpc_address = env::var(TTRPC_ADDRESS)?;
|
let ttrpc_address = env::var(TTRPC_ADDRESS)?;
|
||||||
|
|
||||||
// Create shim instance
|
// Create shim instance
|
||||||
|
|
@ -593,4 +599,42 @@ mod tests {
|
||||||
panic!("{:?}", err);
|
panic!("{:?}", err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Nop {}
|
||||||
|
|
||||||
|
struct NopTask {}
|
||||||
|
impl Task for NopTask {}
|
||||||
|
|
||||||
|
impl Shim for Nop {
|
||||||
|
type T = NopTask;
|
||||||
|
|
||||||
|
fn new(_runtime_id: &str, _args: &Flags, _config: &mut Config) -> Self {
|
||||||
|
Nop {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn start_shim(&mut self, _opts: StartOpts) -> Result<String> {
|
||||||
|
Ok("".to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn delete_shim(&mut self) -> Result<DeleteResponse> {
|
||||||
|
Ok(DeleteResponse::default())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn wait(&mut self) {}
|
||||||
|
|
||||||
|
fn create_task_service(&self, _publisher: RemotePublisher) -> Self::T {
|
||||||
|
NopTask {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn no_namespace() {
|
||||||
|
let runtime_id = "test";
|
||||||
|
let res = bootstrap::<Nop>(runtime_id, None);
|
||||||
|
assert!(res.is_err());
|
||||||
|
assert!(res
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string()
|
||||||
|
.contains("Shim namespace cannot be empty"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue