use std::sync::Arc;
use crate::runtime::RdsRuntime;
use crate::SharedRdsState;
fn default_db_name(engine: &str) -> &'static str {
match engine {
"mysql" | "mariadb" => "mysql",
"oracle-ee" | "oracle-se2" | "oracle-ee-cdb" | "oracle-se2-cdb" => "ORCL",
"sqlserver-ee" | "sqlserver-se" | "sqlserver-ex" | "sqlserver-web" => "master",
"db2-se" | "db2-ae" => "BLUDB",
_ => "postgres",
}
}
pub async fn cfn_ensure_instance_container(
state: SharedRdsState,
runtime: Arc<RdsRuntime>,
identifier: String,
account_id: String,
region: String,
) {
let params = {
let mut accounts = state.write();
let st = accounts.get_or_create(&account_id);
match st.instances.get(&identifier) {
Some(inst) => {
let db_name = inst
.db_name
.clone()
.unwrap_or_else(|| default_db_name(&inst.engine).to_string());
(
inst.engine.clone(),
inst.engine_version.clone(),
inst.master_username.clone(),
inst.master_user_password.clone(),
db_name,
inst.tags.clone(),
)
}
None => return,
}
};
let (engine, engine_version, username, password, db_name, tags) = params;
match runtime
.ensure_postgres(
&identifier,
&engine,
&engine_version,
&username,
&password,
&db_name,
&account_id,
®ion,
&tags,
)
.await
{
Ok(running) => {
let present = {
let mut accounts = state.write();
let st = accounts.get_or_create(&account_id);
if let Some(inst) = st.instances.get_mut(&identifier) {
inst.db_instance_status = "available".to_string();
inst.endpoint_address = running.endpoint_address;
inst.port = i32::from(running.endpoint_port);
inst.host_port = running.host_port;
inst.container_id = running.container_id;
true
} else {
false
}
};
if !present {
runtime.stop_container(&identifier).await;
}
}
Err(error) => {
tracing::error!(
%error,
db_instance_identifier = %identifier,
"CFN-provisioned RDS instance failed to start its container",
);
let mut accounts = state.write();
let st = accounts.get_or_create(&account_id);
if let Some(inst) = st.instances.get_mut(&identifier) {
inst.db_instance_status = "failed".to_string();
}
}
}
}
pub async fn cfn_teardown_instance_container(
runtime: Arc<RdsRuntime>,
identifier: String,
account_id: String,
) {
runtime.stop_container(&identifier).await;
runtime.remove_data_volume(&account_id, &identifier).await;
}