Skip to content

Commit f7c73bd

Browse files
committed
Add new tmux plugin
1 parent 805df7e commit f7c73bd

29 files changed

Lines changed: 345 additions & 8 deletions

File tree

cli/polyaxon/_auxiliaries/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@
1717
get_default_sidecar_container,
1818
get_sidecar_resources,
1919
)
20+
from polyaxon._auxiliaries.tmux import (
21+
V1PolyaxonTmuxContainer,
22+
get_default_tmux_container,
23+
get_tmux_resources,
24+
)
2025
from polyaxon._auxiliaries.tuner import get_default_tuner_container

cli/polyaxon/_auxiliaries/tmux.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
from typing import Any, Dict, Optional, Union
2+
3+
from clipped.compact.pydantic import Field, StrictStr
4+
from clipped.types.ref_or_obj import RefField
5+
from clipped.utils.versions import clean_version_post_suffix
6+
7+
from polyaxon import pkg
8+
from polyaxon._containers.pull_policy import PullPolicy
9+
from polyaxon._k8s import k8s_schemas
10+
from polyaxon._schemas.base import BaseSchemaModel
11+
12+
13+
def get_tmux_resources() -> k8s_schemas.V1ResourceRequirements:
14+
return k8s_schemas.V1ResourceRequirements(
15+
limits={"cpu": "100m", "memory": "64Mi"},
16+
requests={"cpu": "50m", "memory": "32Mi"},
17+
)
18+
19+
20+
class V1PolyaxonTmuxContainer(BaseSchemaModel):
21+
_IDENTIFIER = "tmux"
22+
23+
image: Optional[StrictStr] = None
24+
image_tag: Optional[StrictStr] = Field(alias="imageTag", default=None)
25+
image_pull_policy: Optional[PullPolicy] = Field(
26+
alias="imagePullPolicy", default=None
27+
)
28+
resources: Optional[Union[Dict[str, Any], RefField]] = None
29+
30+
def get_image(self):
31+
image = self.image or "polyaxon/polyaxon-tmux"
32+
image_tag = (
33+
self.image_tag
34+
if self.image_tag is not None
35+
else clean_version_post_suffix(pkg.VERSION)
36+
)
37+
return "{}:{}".format(image, image_tag) if image_tag else image
38+
39+
def get_resources(self):
40+
return self.resources if self.resources else get_tmux_resources()
41+
42+
43+
def get_default_tmux_container(
44+
schema=True,
45+
) -> Union[Dict, V1PolyaxonTmuxContainer]:
46+
default = {
47+
"image": "polyaxon/polyaxon-tmux",
48+
"imageTag": clean_version_post_suffix(pkg.VERSION),
49+
"imagePullPolicy": PullPolicy.IF_NOT_PRESENT.value,
50+
"resources": {
51+
"limits": {"cpu": "100m", "memory": "64Mi"},
52+
"requests": {"cpu": "50m", "memory": "32Mi"},
53+
},
54+
}
55+
if schema:
56+
return V1PolyaxonTmuxContainer.from_dict(default)
57+
return default

cli/polyaxon/_cli/operations.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1547,7 +1547,7 @@ def inspect(ctx, project, uid):
15471547
"--command",
15481548
"-cmd",
15491549
type=str,
1550-
help="Path to download, if not provided the full run's artifacts will downloaded.",
1550+
help="The command to execute, default: /bin/bash (or tmux if the plugin is enabled).",
15511551
)
15521552
@click.option(
15531553
"--pod",
@@ -1600,7 +1600,7 @@ def shell(ctx, project, uid, command, pod, container):
16001600
pty = PseudoTerminal(
16011601
client_shell=client.shell(command=command, pod=pod, container=container)
16021602
)
1603-
pty.start(sys.argv[1:])
1603+
pty.start()
16041604
except (ApiException, HTTPError) as e:
16051605
handle_cli_error(e, message="Could not inspect the run `{}`.".format(run_uuid))
16061606
sys.exit(1)

cli/polyaxon/_client/run.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
from polyaxon._client.decorators import client_handler, get_global_or_inline_config
3939
from polyaxon._client.mixin import ClientMixin
4040
from polyaxon._client.store import PolyaxonStore
41-
from polyaxon._constants.metadata import META_COPY_ARTIFACTS, META_RECOMPILE
41+
from polyaxon._constants.metadata import META_COPY_ARTIFACTS, META_RECOMPILE, META_TMUX
4242
from polyaxon._containers.names import MAIN_CONTAINER_NAMES
4343
from polyaxon._contexts import paths as ctx_paths
4444
from polyaxon._env_vars.getters import (
@@ -976,6 +976,7 @@ def shell(
976976
"The shell command is only usable for operations managed by Polyaxon "
977977
"and actively running."
978978
)
979+
inspection = inspection.get("pods", {})
979980
if not pod:
980981
pod = next(iter(inspection.keys()))
981982
pod_content = inspection.get(pod, {})
@@ -1027,7 +1028,12 @@ def shell(
10271028
)
10281029
url = absolute_uri(url=url, host=self.client.config.host)
10291030

1030-
command = command or "/bin/bash"
1031+
if not command:
1032+
command = (
1033+
"/opt/polyaxon/bin/tmux new-session -A -s terminal"
1034+
if self._has_meta_key(META_TMUX)
1035+
else "/bin/bash"
1036+
)
10311037
return ws_client.websocket_call(
10321038
self.client.config.sdk_config,
10331039
url,

cli/polyaxon/_compiler/resolver/agent.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
from polyaxon._auxiliaries import (
99
V1PolyaxonInitContainer,
1010
V1PolyaxonSidecarContainer,
11+
V1PolyaxonTmuxContainer,
1112
get_default_init_container,
1213
get_default_sidecar_container,
14+
get_default_tmux_container,
1315
)
1416
from polyaxon._connections import V1Connection, V1ConnectionResource
1517
from polyaxon._flow import V1CompiledOperation, V1Init
@@ -21,6 +23,7 @@
2123
class AgentResolver(BaseSchemaModel):
2224
polyaxon_sidecar: Optional[V1PolyaxonSidecarContainer] = None
2325
polyaxon_init: Optional[V1PolyaxonInitContainer] = None
26+
polyaxon_tmux: Optional[V1PolyaxonTmuxContainer] = None
2427
namespace: Optional[str] = None
2528
secrets: Optional[List[Union[V1ConnectionResource, ConnectionResource]]] = None
2629
config_maps: Optional[List[Union[V1ConnectionResource, ConnectionResource]]] = None
@@ -50,6 +53,7 @@ def resolve(
5053

5154
self.polyaxon_sidecar = agent_config.sidecar or get_default_sidecar_container()
5255
self.polyaxon_init = agent_config.init or get_default_init_container()
56+
self.polyaxon_tmux = agent_config.tmux or get_default_tmux_container()
5357
if compiled_operation.namespace:
5458
namespaces = agent_config.additional_namespaces or []
5559
namespaces.append(agent_config.namespace)

cli/polyaxon/_constants/metadata.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@
2222
META_DESTINATION_IMAGE = "destination_image"
2323
META_PROGRESS = "progress"
2424
META_RECOMPILE = "recompile"
25+
META_TMUX = "tmux"
2526
META_TTL = "ttl"

cli/polyaxon/_containers/names.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
PYTORCHJOBS_CONTAINER,
1111
]
1212
INIT_AUTH_CONTAINER = "polyaxon-init-auth"
13+
INIT_TMUX_CONTAINER = "polyaxon-init-tmux"
1314
INIT_DOCKERFILE_CONTAINER_PREFIX = "polyaxon-init-dockerfile"
1415
INIT_FILE_CONTAINER_PREFIX = "polyaxon-init-file"
1516
INIT_TENSORBOARD_CONTAINER_PREFIX = "polyaxon-init-tb"

cli/polyaxon/_contexts/paths.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
CONTEXT_MOUNT_ARTIFACTS_FORMAT
4343
)
4444
CONTEXT_MOUNT_SHM = "/dev/shm"
45+
CONTEXT_MOUNT_TMUX_BIN = "/opt/polyaxon/bin"
4546
CONTEXT_MOUNT_DOCKER = "/var/run/docker.sock"
4647

4748
CONTEXT_TMP_POLYAXON_PATH = get_temp_path(".polyaxon")

cli/polyaxon/_deploy/schemas/deployment.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
V1PolyaxonInitContainer,
1919
V1PolyaxonNotifier,
2020
V1PolyaxonSidecarContainer,
21+
V1PolyaxonTmuxContainer,
2122
)
2223
from polyaxon._auxiliaries.default_scheduling import V1DefaultScheduling
2324
from polyaxon._connections import V1Connection
@@ -252,6 +253,7 @@ class DeploymentConfig(BaseSchemaModel):
252253
operator: Optional[OperatorServiceConfig] = None
253254
init: Optional[V1PolyaxonInitContainer] = None
254255
sidecar: Optional[V1PolyaxonSidecarContainer] = None
256+
tmux: Optional[V1PolyaxonTmuxContainer] = None
255257
notifier: Optional[V1PolyaxonNotifier] = None
256258
cleaner: Optional[V1PolyaxonCleaner] = None
257259
default_scheduling: Optional[V1DefaultScheduling] = Field(

cli/polyaxon/_docker/converter/base/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ def _get_main_container(
5858
use_artifacts_context=False, # Main container has a check and handling for this
5959
use_docker_context=plugins.docker,
6060
use_shm_context=plugins.shm,
61+
use_tmux_context=plugins.tmux,
6162
run_path=run_path,
6263
)
6364
if plugins

0 commit comments

Comments
 (0)