|
|
@ -930,16 +930,14 @@ impl Config {
|
|
|
|
|
|
|
|
|
|
|
|
fn load_roles(&mut self) -> Result<()> {
|
|
|
|
fn load_roles(&mut self) -> Result<()> {
|
|
|
|
let path = Self::roles_file()?;
|
|
|
|
let path = Self::roles_file()?;
|
|
|
|
if !path.exists() {
|
|
|
|
self.roles = if !path.exists() {
|
|
|
|
return Ok(());
|
|
|
|
vec![]
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
let content = read_to_string(&path)
|
|
|
|
let content = read_to_string(&path)
|
|
|
|
.with_context(|| format!("Failed to load roles at {}", path.display()))?;
|
|
|
|
.with_context(|| format!("Failed to load roles at {}", path.display()))?;
|
|
|
|
let roles: Vec<Role> =
|
|
|
|
serde_yaml::from_str(&content).with_context(|| "Invalid roles config")?
|
|
|
|
serde_yaml::from_str(&content).with_context(|| "Invalid roles config")?;
|
|
|
|
};
|
|
|
|
|
|
|
|
let exist_roles: HashSet<_> = self.roles.iter().map(|v| v.name.clone()).collect();
|
|
|
|
let exist_roles: HashSet<_> = roles.iter().map(|v| v.name.clone()).collect();
|
|
|
|
|
|
|
|
self.roles = roles;
|
|
|
|
|
|
|
|
let builtin_roles = Role::builtin();
|
|
|
|
let builtin_roles = Role::builtin();
|
|
|
|
for role in builtin_roles {
|
|
|
|
for role in builtin_roles {
|
|
|
|
if !exist_roles.contains(&role.name) {
|
|
|
|
if !exist_roles.contains(&role.name) {
|
|
|
|