94 lines
2.9 KiB
Python
94 lines
2.9 KiB
Python
# Copyright 2015 The Chromium Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
# TODO(dtu): Merge this file with its counterparts in catapult_build/ when
|
|
# dashboard and PI migrate to Google Cloud SDK.
|
|
|
|
import contextlib
|
|
import os
|
|
import re
|
|
import shutil
|
|
import subprocess
|
|
import tempfile
|
|
import sys
|
|
|
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
|
|
from base import constants
|
|
|
|
|
|
def Modules(root_dir):
|
|
"""Yields module names in root_dir."""
|
|
for root, _, files in os.walk(root_dir):
|
|
for file_name in files:
|
|
if os.path.splitext(file_name)[1] == '.yaml':
|
|
yield os.path.basename(root)
|
|
break
|
|
|
|
|
|
def Yamls(root_dir):
|
|
"""Yields yaml files in root_dir."""
|
|
for root, _, files in os.walk(root_dir):
|
|
for file_name in files:
|
|
if os.path.splitext(file_name)[1] == '.yaml':
|
|
yield os.path.join(root, file_name)
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def TempAppDir(root_dir, symlinks):
|
|
"""Sets up and tears down a directory for deploying or running an app.
|
|
|
|
Args:
|
|
root_dir: The root directory of the app.
|
|
symlinks: If true, use symbolic links instead of copying files. This allows
|
|
the dev server to detect file changes in the repo, and is faster.
|
|
|
|
Yields:
|
|
The path to the temporary directory.
|
|
"""
|
|
if symlinks:
|
|
link = os.symlink
|
|
else:
|
|
def Link(src, dest):
|
|
if os.path.isdir(src):
|
|
return shutil.copytree(src, dest)
|
|
else:
|
|
return shutil.copy2(src, dest)
|
|
link = Link
|
|
|
|
gcloud_lib_dir = _GcloudLibDir()
|
|
temp_app_dir = tempfile.mkdtemp(prefix='app-')
|
|
try:
|
|
for module in Modules(root_dir):
|
|
module_source_dir = os.path.join(root_dir, module)
|
|
module_dest_dir = os.path.join(temp_app_dir, module)
|
|
os.mkdir(module_dest_dir)
|
|
|
|
# Copy/symlink module into app directory.
|
|
for node in os.listdir(module_source_dir):
|
|
link(os.path.join(module_source_dir, node),
|
|
os.path.join(module_dest_dir, node))
|
|
|
|
# Copy/symlink base/ into module directory.
|
|
link(os.path.join(root_dir, 'base'),
|
|
os.path.join(module_dest_dir, 'base'))
|
|
|
|
# Copy/symlink Gcloud library dependencies into module directory.
|
|
third_party_dest_dir = os.path.join(module_dest_dir, 'third_party')
|
|
os.mkdir(third_party_dest_dir)
|
|
open(os.path.join(third_party_dest_dir, '__init__.py'), 'w').close()
|
|
for library in constants.GCLOUD_THIRD_PARTY_LIBRARIES:
|
|
link(os.path.join(gcloud_lib_dir, library),
|
|
os.path.join(third_party_dest_dir, library))
|
|
|
|
yield temp_app_dir
|
|
finally:
|
|
shutil.rmtree(temp_app_dir)
|
|
|
|
|
|
def _GcloudLibDir():
|
|
process = subprocess.Popen(['gcloud', 'info'], stdout=subprocess.PIPE)
|
|
stdout, _ = process.communicate()
|
|
gcloud_root_dir = re.search(r'^Installation Root: \[(.*)\]$', stdout,
|
|
flags=re.MULTILINE).groups()[0]
|
|
return os.path.join(gcloud_root_dir, 'lib', 'third_party')
|