use std::sync::Arc;
use crate::runtime::EcsRuntime;
use crate::{EcsState, SharedEcsState};
pub async fn cfn_launch_service_tasks(
state: SharedEcsState,
runtime: Arc<EcsRuntime>,
cluster_name: String,
service_name: String,
account_id: String,
) {
let spawn_task_ids = {
let mut accounts = state.write();
let Some(st) = accounts.get_mut(&account_id) else {
return;
};
let key = EcsState::service_key(&cluster_name, &service_name);
let Some(service) = st.services.get(&key).cloned() else {
return;
};
if service.desired_count <= 0 {
return;
}
let principal_arn = service
.created_by
.clone()
.unwrap_or_else(|| format!("arn:aws:iam::{account_id}:root"));
let launch_type = service.launch_type.clone();
let desired = service.desired_count;
crate::service::spawn_service_tasks(
st,
&service,
desired,
&principal_arn,
&launch_type,
None,
)
};
for id in spawn_task_ids {
runtime
.clone()
.run_task(state.clone(), id, account_id.clone());
}
}
pub async fn cfn_stop_service_tasks(
state: SharedEcsState,
runtime: Arc<EcsRuntime>,
cluster_name: String,
service_name: String,
account_id: String,
) {
let task_ids = {
let mut accounts = state.write();
let Some(st) = accounts.get_mut(&account_id) else {
return;
};
let service_tag = format!("ecs-svc/{service_name}");
let ids: Vec<String> = st
.tasks
.iter()
.filter(|(_, t)| {
t.started_by.as_deref() == Some(service_tag.as_str())
&& t.cluster_name == cluster_name
&& t.last_status != "STOPPED"
})
.map(|(id, _)| id.clone())
.collect();
ids
};
for id in &task_ids {
runtime.stop_task(id, "CloudFormation stack deletion").await;
let mut accounts = state.write();
if let Some(st) = accounts.get_mut(&account_id) {
st.tasks.remove(id);
}
}
}