Source code for idmtools_platform_container.platform_operations.simulation_operations
"""
Here we implement the ContainerPlatform simulation operations.
Copyright 2021, Bill & Melinda Gates Foundation. All rights reserved.
"""
import subprocess
from dataclasses import dataclass
from typing import NoReturn, Dict
from idmtools.core import ItemType
from idmtools_platform_file.platform_operations.simulation_operations import FilePlatformSimulationOperations
from idmtools_platform_container.container_operations.docker_operations import find_running_job
from logging import getLogger
logger = getLogger(__name__)
user_logger = getLogger('user')
[docs]@dataclass
class ContainerPlatformSimulationOperations(FilePlatformSimulationOperations):
"""
Simulation Operation for Container Platform.
"""
[docs] def platform_cancel(self, sim_id: str, force: bool = False) -> NoReturn:
"""
Cancel platform simulation's container job.
Args:
sim_id: simulation id
force: bool, True/False
Returns:
NoReturn
"""
job = find_running_job(self.platform, sim_id)
if job:
if job.item_type != ItemType.SIMULATION:
pass
user_logger.debug(
f"{job.item_type.name} {sim_id} is running on Container {job.container_id}.")
kill_cmd = f"docker exec {job.container_id} kill -9 {job.job_id}"
result = subprocess.run(kill_cmd, shell=True, stderr=subprocess.PIPE, text=True)
if result.returncode == 0:
print(f"Successfully killed {job.item_type.name} {sim_id}")
else:
print(f"Error killing {job.item_type.name} {sim_id}: {result.stderr}")
else:
user_logger.info(f"Simulation {sim_id} is not running, no cancel needed...")
[docs] def create_sim_directory_map(self, simulation_id: str) -> Dict:
"""
Build simulation working directory mapping.
Args:
simulation_id: simulation id
Returns:
Dict of simulation id as key and working dir as value
"""
sim = self.platform.get_item(simulation_id, ItemType.SIMULATION, raw=False)
return {sim.id: str(self.platform.get_container_directory(sim))}