blob: e1e8f4ce36e7fb22334157b8d7dadbf45f3eb78a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 crate::cluster::router::condition::{
condition_router::{ConditionRouter, ConditionSingleRouters},
single_router::ConditionSingleRouter,
};
use crate::config::router::ConditionRouterConfig;
use std::{
collections::HashMap,
sync::{Arc, RwLock},
};
#[derive(Debug, Clone, Default)]
pub struct ConditionRouterManager {
//Application-level routing applies globally, while service-level routing only affects a specific service.
pub routers_service: HashMap<String, Arc<RwLock<ConditionSingleRouters>>>,
pub routers_application: Arc<RwLock<ConditionSingleRouters>>,
}
impl ConditionRouterManager {
pub fn get_router(&self, service_name: &String) -> Option<ConditionRouter> {
let routers_application_is_null = self.routers_application.read().unwrap().is_null();
self.routers_service
.get(service_name)
.map(|routers_service| {
ConditionRouter::new(
Some(routers_service.clone()),
if routers_application_is_null {
None
} else {
Some(self.routers_application.clone())
},
)
})
.or_else(|| {
if routers_application_is_null {
None
} else {
Some(ConditionRouter::new(
None,
Some(self.routers_application.clone()),
))
}
})
}
pub fn update(&mut self, config: ConditionRouterConfig) {
let force = config.force;
let scope = config.scope;
let key = config.key;
let enable = config.enabled;
let routers = config
.conditions
.into_iter()
.map(|condition| ConditionSingleRouter::new(condition, force, enable))
.collect::<Vec<_>>();
match scope.as_str() {
"application" => {
self.routers_application.write().unwrap().routers = routers;
}
"service" => {
self.routers_service
.entry(key)
.or_insert_with(|| Arc::new(RwLock::new(ConditionSingleRouters::new(vec![]))))
.write()
.unwrap()
.routers = routers;
}
_ => {}
}
}
}