feature/multiple-compose #11

Merged
unsalted_salt merged 7 commits from feature/multiple-compose into master 2024-11-18 14:27:31 -04:00
3 changed files with 46 additions and 35 deletions
Showing only changes of commit f035a09321 - Show all commits

View File

@ -70,7 +70,7 @@ async def main():
).bind_value(newRobotParams, 'sysid') ).bind_value(newRobotParams, 'sysid')
default_robot_compose = ( default_robot_compose = (
"/robots/spiri-mu/core/docker-compose.yaml\n" "/robots/spiri-mu/core/docker-compose.yaml\n"
"#/robots/spiri-mu/virtual_camera/docker-compose.yaml" "#/robots/spiri-mu/virtual_camera/docker-compose.yaml --build"
) )
ui.label("Compose files").classes("text-xl") ui.label("Compose files").classes("text-xl")
ui.codemirror(value=default_robot_compose, language="bash", theme="basicDark").bind_value(newRobotParams, 'compose_files') ui.codemirror(value=default_robot_compose, language="bash", theme="basicDark").bind_value(newRobotParams, 'compose_files')

View File

@ -96,38 +96,39 @@ class Robot:
container_status = {} container_status = {}
with element: with element:
while True: while True:
# Poll for data that changes with logger.catch():
for container in self.containers(): # Poll for data that changes
try: for container in self.containers():
health = container.attrs["State"]["Health"]["Status"] try:
except KeyError: health = container.attrs["State"]["Health"]["Status"]
health = "Unknown" except KeyError:
health = "Unknown"
container_status[container] = ( container_status[container] = (
f"{container.name} {container.status} {health}" f"{container.name} {container.status} {health}"
) )
if container not in docker_elements: if container not in docker_elements:
docker_elements[container] = ui.element().classes("w-full") docker_elements[container] = ui.element().classes("w-full")
with docker_elements[container]: with docker_elements[container]:
ui.label().bind_text(container_status, container).classes( ui.label().bind_text(container_status, container).classes(
"text-lg" "text-lg"
) )
#Show the command the container is running #Show the command the container is running
# ui.label(container.attrs["Config"]["Cmd"]) # ui.label(container.attrs["Config"]["Cmd"])
cmd_widget = ui.codemirror(" ".join(container.attrs["Config"]["Cmd"]), language="bash",theme="basicDark").classes('h-auto max-h-32') cmd_widget = ui.codemirror(" ".join(container.attrs["Config"]["Cmd"]), language="bash",theme="basicDark").classes('h-auto max-h-32')
cmd_widget.enabled = False cmd_widget.enabled = False
logelement = ( logelement = (
ui.expansion("Logs") ui.expansion("Logs")
.style("margin: 10px;") .style("margin: 10px;")
.classes("w-full outline outline-1") .classes("w-full outline outline-1")
) )
asyncio.create_task(container_logs(container, logelement)) asyncio.create_task(container_logs(container, logelement))
# Check for containers that have been removed # Check for containers that have been removed
removed = set(docker_elements.keys()) - set(self.containers()) removed = set(docker_elements.keys()) - set(self.containers())
for container in removed: for container in removed:
self.robot_ui.remove(docker_elements[container]) self.robot_ui.remove(docker_elements[container])
docker_elements.pop(container) docker_elements.pop(container)
await asyncio.sleep(1) await asyncio.sleep(1)
async def ui_ros(self, element): async def ui_ros(self, element):
with element: with element:
@ -221,6 +222,11 @@ class Robot:
self.spawn_gz_model() self.spawn_gz_model()
logger.info("Starting drone stack, this may take some time") logger.info("Starting drone stack, this may take some time")
for compose_file in self.compose_files: for compose_file in self.compose_files:
arguments = compose_file.split(" ")
arguments = [arg.strip() for arg in arguments]
compose_file = arguments[0]
arguments = arguments[1:]
if not isinstance(compose_file, Path): if not isinstance(compose_file, Path):
compose_file = Path(compose_file) compose_file = Path(compose_file)
if not compose_file.exists(): if not compose_file.exists():
@ -236,15 +242,17 @@ class Robot:
"-f", "-f",
compose_file.as_posix(), compose_file.as_posix(),
"up", "up",
*arguments,
] ]
command = " ".join(args) command = " ".join(args)
logger.info(f"Starting drone stack with command: {command}") logger.info(f"Starting drone stack with command: {command}")
docker_stack = subprocess.Popen( docker_stack = subprocess.Popen(
args, args,
stdout=subprocess.PIPE, # stdout=subprocess.PIPE,
stderr=subprocess.PIPE, # stderr=subprocess.PIPE,
) )
logger.info(f"Started drone stack with PID: {docker_stack.pid}")
@logger.catch @logger.catch
def spawn_gz_model(self): def spawn_gz_model(self):

View File

@ -4,7 +4,10 @@ services:
ipc: host ipc: host
network_mode: host network_mode: host
# image: git.spirirobotics.com/spiri/services-ros2-mavros:main # image: git.spirirobotics.com/spiri/services-ros2-mavros:main
#Build the iamge, give it a name, don't try to pull the image
build: ./ build: ./
image: spirisdk-virtual_camera
pull_policy: never
environment: environment:
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp - RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
command: ros2 run ros_gz_image image_bridge /world/${WORLD_NAME}/model/${ROBOT_NAME}/link/pitch_link/sensor/camera/image command: ros2 run ros_gz_image image_bridge /world/${WORLD_NAME}/model/${ROBOT_NAME}/link/pitch_link/sensor/camera/image