Mercurial > repos > shellac > sam_consensus_v3
comparison env/lib/python3.9/site-packages/cwltool/docker_id.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
| author | shellac |
|---|---|
| date | Mon, 22 Mar 2021 18:12:50 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:4f3585e2f14b |
|---|---|
| 1 """Helper functions for docker.""" | |
| 2 | |
| 3 import subprocess # nosec | |
| 4 from typing import List, Optional, Tuple | |
| 5 | |
| 6 | |
| 7 def docker_vm_id() -> Tuple[Optional[int], Optional[int]]: | |
| 8 """ | |
| 9 Return the User ID and Group ID of the default docker user inside the VM. | |
| 10 | |
| 11 When a host is using boot2docker or docker-machine to run docker with | |
| 12 boot2docker.iso (As on Mac OS X), the UID that mounts the shared filesystem | |
| 13 inside the VirtualBox VM is likely different than the user's UID on the host. | |
| 14 :return: A tuple containing numeric User ID and Group ID of the docker account inside | |
| 15 the boot2docker VM | |
| 16 """ | |
| 17 if boot2docker_running(): | |
| 18 return boot2docker_id() | |
| 19 if docker_machine_running(): | |
| 20 return docker_machine_id() | |
| 21 return (None, None) | |
| 22 | |
| 23 | |
| 24 def check_output_and_strip(cmd: List[str]) -> Optional[str]: | |
| 25 """ | |
| 26 Pass a command list to subprocess.check_output. | |
| 27 | |
| 28 Returning None if an expected exception is raised | |
| 29 :param cmd: The command to execute | |
| 30 :return: Stripped string output of the command, or None if error | |
| 31 """ | |
| 32 try: | |
| 33 result = subprocess.check_output( # nosec | |
| 34 cmd, stderr=subprocess.STDOUT, universal_newlines=True | |
| 35 ) | |
| 36 return result.strip() | |
| 37 except (OSError, subprocess.CalledProcessError, TypeError, AttributeError): | |
| 38 # OSError is raised if command doesn't exist | |
| 39 # CalledProcessError is raised if command returns nonzero | |
| 40 # AttributeError is raised if result cannot be strip()ped | |
| 41 return None | |
| 42 | |
| 43 | |
| 44 def docker_machine_name() -> Optional[str]: | |
| 45 """ | |
| 46 Get the machine name of the active docker-machine machine. | |
| 47 | |
| 48 :return: Name of the active machine or None if error | |
| 49 """ | |
| 50 return check_output_and_strip(["docker-machine", "active"]) | |
| 51 | |
| 52 | |
| 53 def cmd_output_matches(check_cmd: List[str], expected_status: str) -> bool: | |
| 54 """ | |
| 55 Run a command and compares output to expected. | |
| 56 | |
| 57 :param check_cmd: Command list to execute | |
| 58 :param expected_status: Expected output, e.g. "Running" or "poweroff" | |
| 59 :return: Boolean value, indicating whether or not command result matched | |
| 60 """ | |
| 61 return check_output_and_strip(check_cmd) == expected_status | |
| 62 | |
| 63 | |
| 64 def boot2docker_running() -> bool: | |
| 65 """ | |
| 66 Check if boot2docker CLI reports that boot2docker vm is running. | |
| 67 | |
| 68 :return: True if vm is running, False otherwise | |
| 69 """ | |
| 70 return cmd_output_matches(["boot2docker", "status"], "running") | |
| 71 | |
| 72 | |
| 73 def docker_machine_running() -> bool: | |
| 74 """ | |
| 75 Ask docker-machine for the active machine and checks if its VM is running. | |
| 76 | |
| 77 :return: True if vm is running, False otherwise | |
| 78 """ | |
| 79 machine_name = docker_machine_name() | |
| 80 if not machine_name: | |
| 81 return False | |
| 82 return cmd_output_matches(["docker-machine", "status", machine_name], "Running") | |
| 83 | |
| 84 | |
| 85 def cmd_output_to_int(cmd: List[str]) -> Optional[int]: | |
| 86 """ | |
| 87 Run the provided command and returns the integer value of the result. | |
| 88 | |
| 89 :param cmd: The command to run | |
| 90 :return: Integer value of result, or None if an error occurred | |
| 91 """ | |
| 92 result = check_output_and_strip(cmd) # may return None | |
| 93 if result is not None: | |
| 94 try: | |
| 95 return int(result) | |
| 96 except ValueError: | |
| 97 # ValueError is raised if int conversion fails | |
| 98 return None | |
| 99 return None | |
| 100 | |
| 101 | |
| 102 def boot2docker_id() -> Tuple[Optional[int], Optional[int]]: | |
| 103 """ | |
| 104 Get the UID and GID of the docker user inside a running boot2docker vm. | |
| 105 | |
| 106 :return: Tuple (UID, GID), or (None, None) if error (e.g. boot2docker not present or stopped) | |
| 107 """ | |
| 108 uid = cmd_output_to_int(["boot2docker", "ssh", "id", "-"]) | |
| 109 gid = cmd_output_to_int(["boot2docker", "ssh", "id", "-g"]) | |
| 110 return (uid, gid) | |
| 111 | |
| 112 | |
| 113 def docker_machine_id() -> Tuple[Optional[int], Optional[int]]: | |
| 114 """ | |
| 115 Ask docker-machine for active machine and gets the UID of the docker user. | |
| 116 | |
| 117 inside the vm | |
| 118 :return: tuple (UID, GID), or (None, None) if error (e.g. docker-machine not present or stopped) | |
| 119 """ | |
| 120 machine_name = docker_machine_name() | |
| 121 if not machine_name: | |
| 122 return (None, None) | |
| 123 uid = cmd_output_to_int(["docker-machine", "ssh", machine_name, "id -"]) | |
| 124 gid = cmd_output_to_int(["docker-machine", "ssh", machine_name, "id -g"]) | |
| 125 return (uid, gid) | |
| 126 | |
| 127 | |
| 128 if __name__ == "__main__": | |
| 129 print(docker_vm_id()) |
