Lines Matching +full:is +full:- +full:docker
3 # Use of this source code is governed by a BSD-style license that can be
16 # ./tools/dev_container --stop
19 # is cleaned up afterwards (e.g. when run by Kokoro):
21 # ./tools/dev_container --hermetic CMD
25 # ./tools/dev_container --cros
54 f"crosvm_dev_{getpass.getuser()}_{zlib.crc32(os.path.realpath(__file__).encode('utf-8')):x}"
57 f"crosvm_cros_{getpass.getuser()}_{zlib.crc32(os.path.realpath(__file__).encode('utf-8')):x}"
60 DEV_IMAGE_NAME = "gcr.io/crosvm-infra/crosvm_dev"
61 CROS_IMAGE_NAME = "gcr.io/crosvm-infra/crosvm_cros_cloudbuild"
68 f"--volume {CACHE_DIR}:/cache:rw" if CACHE_DIR else None,
70 "--mount type=tmpfs,destination=/tmp",
71 # KVM is required to run a VM for testing.
72 "--device /dev/kvm" if Path("/dev/kvm").is_char_device() else None,
74 f"--env TERM={os.environ.get('TERM', 'xterm-256color')}",
84 "--group-add keep-groups" if os.name == "posix" else None,
86 "--pids-limit=4096" if os.name == "posix" else None,
97 def machine_is_running(docker: cmd):
98 machine_state = docker("machine info").stdout()
109 def container_revision(docker: cmd, container_id: str):
110 image = docker("container inspect -f {{.Config.Image}}", container_id).stdout()
116 def container_id(docker: cmd, cros: bool):
117 return docker(f"ps -a -q -f name={container_name(cros)}").stdout()
120 def container_is_running(docker: cmd, cros: bool):
121 return bool(docker(f"ps -q -f name={container_name(cros)}").stdout())
124 def delete_container(docker: cmd, cros: bool):
125 cid = container_id(docker, cros)
127 print(f"Deleting dev-container {cid}.")
128 docker("rm -f", cid).fg(quiet=True)
141 return ["--workdir /home/crosvmdev/chromiumos/src/platform/crosvm"]
144 f"--volume {quoted(cros_repo_root())}:/workspace:rw",
145 "--workdir /workspace/src/platform/crosvm",
149 f"--volume {quoted(kiwi_repo_root())}:/workspace:rw",
152 f"--volume {quoted(kiwi_repo_root())}/scratch:/scratch/cargo_target:rw",
153 "--workdir /workspace/platform/crosvm",
157 f"--volume {quoted(aosp_repo_root())}:/workspace:rw",
158 "--workdir /workspace/external/crosvm",
162 f"--volume {quoted(CROSVM_ROOT)}:/workspace:rw",
166 def ensure_container_is_alive(docker: cmd, docker_args: List[Optional[str]], cros: bool):
167 cid = container_id(docker, cros)
168 if cid and not container_is_running(docker, cros):
169 print("Existing container is not running.")
170 delete_container(docker, cros)
171 elif cid and not cros and container_revision(docker, cid) != DEV_IMAGE_VERSION:
172 print(f"New image is available.")
173 delete_container(docker, cros)
175 if not container_is_running(docker, cros):
176 # Run neverending sleep to keep container alive while we 'docker exec' commands.
178 docker(
179 f"run --detach --name {container_name(cros)}",
183 cid = container_id(docker, cros)
185 cid = container_id(docker, cros)
191 graph_driver_name = podman("info --format={{.Store.GraphDriverName}}").stdout()
192 config_file_name = podman("info --format={{.Store.ConfigFile}}").stdout()
195 print("Using the overlay driver is strongly recommended.")
198 podman("system reset -f").fg()
209 "sudo usermod --add-subuids 900000-965535 --add-subgids 900000-965535", username
220 parser.add_argument("--stop", action="store_true")
221 parser.add_argument("--clean", action="store_true")
222 parser.add_argument("--hermetic", action="store_true")
223 parser.add_argument("--no-interactive", action="store_true")
224 parser.add_argument("--use-docker", action="store_true")
225 parser.add_argument("--self-test", action="store_true")
226 parser.add_argument("--pull", action="store_true")
227 parser.add_argument("--cros", action="store_true")
237 has_docker = shutil.which("docker") != None
240 raise Exception("Please install podman (or docker) to use the dev container.")
246 # cros container only works in docker
252 "WARNING: Running dev_container with docker may cause root-owned files to be created."
256 docker = cmd("docker")
262 docker = cmd("podman")
266 if os.name == "nt" and not machine_is_running(docker):
268 docker("machine start").fg(quiet=True)
273 validate_podman(docker)
276 docker_args.append("--privileged") # cros container requires privileged container
285 if value is not None:
286 exec_args.append("--env")
290 TestDevContainer.docker = docker
296 if not delete_container(docker, args.cros):
297 print(f"container is not running.")
301 delete_container(docker, args.cros)
305 docker("pull", CROS_IMAGE_NAME).fg()
307 docker("pull", f"gcr.io/crosvm-infra/crosvm_dev:{DEV_IMAGE_VERSION}").fg()
312 # Default to interactive mode if a tty is present.
315 tty_args += ["--tty"]
317 tty_args += ["--interactive"]
321 # cmd is passed to entrypoint
323 docker(f"run --rm", *tty_args, *docker_args, *exec_args, *quoted_cmd).fg()
325 # cmd is executed directly
326 cid = ensure_container_is_alive(docker, docker_args, args.cros)
330 docker("exec", *tty_args, *exec_args, cid, *quoted_cmd).fg()
335 Runs live tests using the docker service.
337 Note: This test is not run by health-check since it cannot be run inside the
338 container. It is run by infra/recipes/health_check.py before running health checks.
341 docker: cmd
349 delete_container(self.docker, cros=False)
353 self.docker(
354 f"create --name {DEV_CONTAINER_NAME}", *self.docker_args, "sleep infinity"
356 self.assertTrue(container_id(self.docker, cros=False))
357 self.assertFalse(container_is_running(self.docker, cros=False))
360 cid = ensure_container_is_alive(self.docker, self.docker_args, cros=False)
361 cid2 = ensure_container_is_alive(self.docker, self.docker_args, cros=False)
365 cid = ensure_container_is_alive(self.docker, self.docker_args, cros=False)
366 self.docker("kill", cid).fg()
369 ensure_container_is_alive(self.docker, self.docker_args, cros=False)
370 self.assertTrue(container_is_running(self.docker, cros=False))