mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-04-30 04:34:27 +00:00
agent: refactor namespace::setup to optimize error handling
- Replace the return value with anyhow::Result. - Remove if let Err. - Remove match. Signed-off-by: Tim Zhang <tim@hyper.sh>
This commit is contained in:
parent
a3c64e5ce5
commit
a18899f1a3
@ -3,15 +3,15 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
//
|
//
|
||||||
|
|
||||||
|
use anyhow::{anyhow, Result};
|
||||||
use nix::mount::MsFlags;
|
use nix::mount::MsFlags;
|
||||||
use nix::sched::{unshare, CloneFlags};
|
use nix::sched::{unshare, CloneFlags};
|
||||||
use nix::unistd::{getpid, gettid};
|
use nix::unistd::{getpid, gettid};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::os::unix::io::AsRawFd;
|
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::thread;
|
use std::thread::{self};
|
||||||
|
|
||||||
use crate::mount::{BareMount, FLAGS};
|
use crate::mount::{BareMount, FLAGS};
|
||||||
use slog::Logger;
|
use slog::Logger;
|
||||||
@ -77,10 +77,8 @@ impl Namespace {
|
|||||||
|
|
||||||
// setup creates persistent namespace without switching to it.
|
// setup creates persistent namespace without switching to it.
|
||||||
// Note, pid namespaces cannot be persisted.
|
// Note, pid namespaces cannot be persisted.
|
||||||
pub fn setup(mut self) -> Result<Self, String> {
|
pub fn setup(mut self) -> Result<Self> {
|
||||||
if let Err(err) = fs::create_dir_all(&self.persistent_ns_dir) {
|
fs::create_dir_all(&self.persistent_ns_dir)?;
|
||||||
return Err(err.to_string());
|
|
||||||
}
|
|
||||||
|
|
||||||
let ns_path = PathBuf::from(&self.persistent_ns_dir);
|
let ns_path = PathBuf::from(&self.persistent_ns_dir);
|
||||||
let ns_type = self.ns_type.clone();
|
let ns_type = self.ns_type.clone();
|
||||||
@ -88,33 +86,23 @@ impl Namespace {
|
|||||||
|
|
||||||
let new_ns_path = ns_path.join(&ns_type.get());
|
let new_ns_path = ns_path.join(&ns_type.get());
|
||||||
|
|
||||||
if let Err(err) = File::create(new_ns_path.as_path()) {
|
File::create(new_ns_path.as_path())?;
|
||||||
return Err(err.to_string());
|
|
||||||
}
|
|
||||||
|
|
||||||
self.path = new_ns_path.clone().into_os_string().into_string().unwrap();
|
self.path = new_ns_path.clone().into_os_string().into_string().unwrap();
|
||||||
let hostname = self.hostname.clone();
|
let hostname = self.hostname.clone();
|
||||||
|
|
||||||
let new_thread = thread::spawn(move || {
|
let new_thread = thread::spawn(move || -> Result<()> {
|
||||||
let origin_ns_path = get_current_thread_ns_path(&ns_type.get());
|
let origin_ns_path = get_current_thread_ns_path(&ns_type.get());
|
||||||
|
|
||||||
let _origin_ns_fd = match File::open(Path::new(&origin_ns_path)) {
|
File::open(Path::new(&origin_ns_path))?;
|
||||||
Err(err) => return Err(err.to_string()),
|
|
||||||
Ok(file) => file.as_raw_fd(),
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create a new netns on the current thread.
|
// Create a new netns on the current thread.
|
||||||
let cf = ns_type.get_flags().clone();
|
let cf = ns_type.get_flags().clone();
|
||||||
|
|
||||||
if let Err(err) = unshare(cf) {
|
unshare(cf)?;
|
||||||
return Err(err.to_string());
|
|
||||||
}
|
|
||||||
|
|
||||||
if ns_type == NamespaceType::UTS && hostname.is_some() {
|
if ns_type == NamespaceType::UTS && hostname.is_some() {
|
||||||
match nix::unistd::sethostname(hostname.unwrap()) {
|
nix::unistd::sethostname(hostname.unwrap())?;
|
||||||
Err(err) => return Err(err.to_string()),
|
|
||||||
Ok(_) => (),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Bind mount the new namespace from the current thread onto the mount point to persist it.
|
// Bind mount the new namespace from the current thread onto the mount point to persist it.
|
||||||
let source: &str = origin_ns_path.as_str();
|
let source: &str = origin_ns_path.as_str();
|
||||||
@ -132,22 +120,20 @@ impl Namespace {
|
|||||||
|
|
||||||
let bare_mount = BareMount::new(source, destination, "none", flags, "", &logger);
|
let bare_mount = BareMount::new(source, destination, "none", flags, "", &logger);
|
||||||
bare_mount.mount().map_err(|e| {
|
bare_mount.mount().map_err(|e| {
|
||||||
format!(
|
anyhow!(
|
||||||
"Failed to mount {} to {} with err:{:?}",
|
"Failed to mount {} to {} with err:{:?}",
|
||||||
source, destination, e
|
source,
|
||||||
|
destination,
|
||||||
|
e
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
});
|
});
|
||||||
|
|
||||||
match new_thread.join() {
|
new_thread
|
||||||
Ok(t) => match t {
|
.join()
|
||||||
Err(err) => return Err(err),
|
.map_err(|e| anyhow!("Failed to join thread {:?}!", e))??;
|
||||||
Ok(()) => (),
|
|
||||||
},
|
|
||||||
Err(err) => return Err(format!("Failed to join thread {:?}!", err)),
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user