Changes to allow exporting robot env
This commit is contained in:
parent
f0fa9f4ae9
commit
0d9db01ced
@ -100,6 +100,8 @@ class Robot:
|
|||||||
"""Start a Docker-in-Docker instance for the robot, using a registry cache."""
|
"""Start a Docker-in-Docker instance for the robot, using a registry cache."""
|
||||||
client = docker.from_env()
|
client = docker.from_env()
|
||||||
cache_proxy = "http://sdk-host.internal:3128"
|
cache_proxy = "http://sdk-host.internal:3128"
|
||||||
|
# sdk_root = os.environ.get("SDK_ROOT")
|
||||||
|
# buildx_shared_cache = str((Path(sdk_root) / "/cache/buildx-cache").absolute())
|
||||||
|
|
||||||
self.docker_daemon = client.containers.run(
|
self.docker_daemon = client.containers.run(
|
||||||
"docker:dind",
|
"docker:dind",
|
||||||
@ -115,10 +117,16 @@ class Robot:
|
|||||||
),
|
),
|
||||||
environment={
|
environment={
|
||||||
"DOCKER_BUILDKIT": "1",
|
"DOCKER_BUILDKIT": "1",
|
||||||
|
"DOCKER_DRIVER": "overlay2",
|
||||||
# "DOCKER_TLS_CERTDIR": "",
|
# "DOCKER_TLS_CERTDIR": "",
|
||||||
},
|
},
|
||||||
extra_hosts={"sdk-host.internal": "host-gateway"},
|
extra_hosts={"sdk-host.internal": "host-gateway"},
|
||||||
# remove=True,
|
volumes={
|
||||||
|
"/var/lib/docker/buildx-cache": {
|
||||||
|
"bind": "/var/lib/docker/buildx-cache",
|
||||||
|
"mode": "rw",
|
||||||
|
},
|
||||||
|
},
|
||||||
detach=True,
|
detach=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -260,7 +268,6 @@ class Robot:
|
|||||||
self.robot_ui.clear()
|
self.robot_ui.clear()
|
||||||
with self.robot_ui:
|
with self.robot_ui:
|
||||||
ui.label(f"{self}").classes("text-2xl")
|
ui.label(f"{self}").classes("text-2xl")
|
||||||
ui.label(f"DOCKER_HOST={self.docker_host}")
|
|
||||||
ui.button("Start", on_click=self.async_start).classes("m-2")
|
ui.button("Start", on_click=self.async_start).classes("m-2")
|
||||||
ui.button("Stop", on_click=self.stop).classes("m-2")
|
ui.button("Stop", on_click=self.stop).classes("m-2")
|
||||||
|
|
||||||
@ -277,6 +284,7 @@ class Robot:
|
|||||||
with ui.tabs() as tabs:
|
with ui.tabs() as tabs:
|
||||||
# tab_logs = ui.tab("Logs")
|
# tab_logs = ui.tab("Logs")
|
||||||
tab_containers = ui.tab("Containers")
|
tab_containers = ui.tab("Containers")
|
||||||
|
tab_environment = ui.tab("Environment")
|
||||||
# tabs_iframe = ui.tab("ui")
|
# tabs_iframe = ui.tab("ui")
|
||||||
# with ui.tab_panels(tabs, value=tab_logs):
|
# with ui.tab_panels(tabs, value=tab_logs):
|
||||||
# tab = ui.tab_panel(tab_logs).classes("w-full")
|
# tab = ui.tab_panel(tab_logs).classes("w-full")
|
||||||
@ -285,6 +293,38 @@ class Robot:
|
|||||||
containers = ui.tab_panel(tab_containers).classes("w-full")
|
containers = ui.tab_panel(tab_containers).classes("w-full")
|
||||||
|
|
||||||
asyncio.create_task(self.ui_containers(containers))
|
asyncio.create_task(self.ui_containers(containers))
|
||||||
|
with ui.tab_panel(tab_environment):
|
||||||
|
environment = []
|
||||||
|
for key, value in self.environ().items():
|
||||||
|
environment.append(f"{key}={value}")
|
||||||
|
for key, value in self.extra_env().items():
|
||||||
|
environment.append(f"{key}={value}")
|
||||||
|
with ui.row():
|
||||||
|
ui.button(
|
||||||
|
"Copy to clipboard",
|
||||||
|
on_click=lambda: ui.clipboard.write(
|
||||||
|
"export " + " ".join(environment)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
ui.button(
|
||||||
|
"Save to file",
|
||||||
|
on_click=lambda: ui.download(
|
||||||
|
"\n".join(environment).encode("utf-8"),
|
||||||
|
f"sdk_env_{self.robot_name}.txt",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
env_vars = ui.codemirror(
|
||||||
|
value="\n".join(environment),
|
||||||
|
language="bash",
|
||||||
|
theme="basicDark",
|
||||||
|
)
|
||||||
|
env_vars.enabled = False
|
||||||
|
ui.label(
|
||||||
|
"These environment variables allow running arbitrary docker containers and stacks "
|
||||||
|
"in the same context as the robot, as well as interacting with the simulated robot's "
|
||||||
|
"docker daemon. Simply copy to clipboard, paste into your terminal, and your docker "
|
||||||
|
"cli and other docker tools will start using the robot's environment."
|
||||||
|
).classes("text-sm")
|
||||||
# iframe = ui.tab_panel(tabs_iframe).classes("w-full")
|
# iframe = ui.tab_panel(tabs_iframe).classes("w-full")
|
||||||
# with iframe:
|
# with iframe:
|
||||||
# ui.link(f"http://{self.robot_ip}",f"http://{self.robot_ip}").classes("m-2")
|
# ui.link(f"http://{self.robot_ip}",f"http://{self.robot_ip}").classes("m-2")
|
||||||
@ -308,15 +348,20 @@ class Robot:
|
|||||||
def extra_env(self):
|
def extra_env(self):
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
def environ(self):
|
||||||
|
return dict(
|
||||||
|
ROBOT_NAME=self.robot_name,
|
||||||
|
WORLD_NAME="citadel_hill",
|
||||||
|
DOCKER_HOST=self.docker_host,
|
||||||
|
)
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
"""Starts the simulated drone with a given sysid,
|
"""Starts the simulated drone with a given sysid,
|
||||||
each drone must have it's own unique ID.
|
each drone must have it's own unique ID.
|
||||||
"""
|
"""
|
||||||
with logger.contextualize(drone=str(self)):
|
with logger.contextualize(drone=str(self)):
|
||||||
with modified_environ(
|
with modified_environ(
|
||||||
ROBOT_NAME=self.robot_name,
|
**self.environ(),
|
||||||
WORLD_NAME="citadel_hill",
|
|
||||||
DOCKER_HOST=self.docker_host,
|
|
||||||
**self.extra_env(),
|
**self.extra_env(),
|
||||||
):
|
):
|
||||||
self.spawn_gz_model()
|
self.spawn_gz_model()
|
||||||
|
Loading…
Reference in New Issue
Block a user