@@ -185,6 +185,11 @@ class AutoservError(Exception):
pass
+class AutoservInstallError(Exception):
+ """Autoserv failed in installing autotest on a client machine"""
+ pass
+
+
class AutoservSSHTimeout(AutoservError):
"""SSH experienced a connection timeout"""
pass
@@ -8,12 +8,6 @@ __author__ = 'raphtee@google.com (Travis Miller)'
import os, sys, ConfigParser
from autotest_lib.client.common_lib import error
-dirname = os.path.dirname(sys.modules[__name__].__file__)
-DEFAULT_CONFIG_FILE = os.path.abspath(os.path.join(dirname,
- "../../global_config.ini"))
-DEFAULT_SHADOW_FILE = os.path.abspath(os.path.join(dirname,
- "../../shadow_config.ini"))
-
class ConfigError(error.AutotestError):
pass
@@ -23,6 +17,34 @@ class ConfigValueError(ConfigError):
pass
+
+common_lib_dir = os.path.dirname(sys.modules[__name__].__file__)
+client_dir = os.path.dirname(common_lib_dir)
+root_dir = os.path.dirname(client_dir)
+
+# Check if the config files are at autotest's root dir
+# This will happen if client is executing inside a full autotest tree, or if
+# other entry points are being executed
+global_config_path_root = os.path.join(root_dir, 'global_config.ini')
+shadow_config_path_root = os.path.join(root_dir, 'shadow_config.ini')
+config_in_root = (os.path.exists(global_config_path_root) and
+ os.path.exists(shadow_config_path_root))
+
+# Check if the config files are at autotest's client dir
+# This will happen if a client stand alone execution is happening
+global_config_path_client = os.path.join(client_dir, 'global_config.ini')
+shadow_config_path_client = os.path.join(client_dir, 'shadow_config.ini')
+config_in_client = (os.path.exists(global_config_path_client) and
+ os.path.exists(shadow_config_path_client))
+
+if config_in_root:
+ DEFAULT_CONFIG_FILE = global_config_path_root
+ DEFAULT_SHADOW_FILE = shadow_config_path_root
+elif config_in_client:
+ DEFAULT_CONFIG_FILE = global_config_path_client
+ DEFAULT_SHADOW_FILE = shadow_config_path_client
+
+
class global_config(object):
_NO_DEFAULT_SPECIFIED = object()
@@ -151,12 +151,25 @@ class BaseAutotest(installable_object.InstallableObject):
self.installed = True
- def _install_using_send_file(self, host, autodir):
- dirs_to_exclude = set(["tests", "site_tests", "deps", "profilers"])
- light_files = [os.path.join(self.source_material, f)
- for f in os.listdir(self.source_material)
- if f not in dirs_to_exclude]
- host.send_file(light_files, autodir, delete_dest=True)
+ def _install_using_send_file(self, host, autodir, full):
+ if full:
+ dirs_to_exclude = set([])
+ else:
+ dirs_to_exclude = set(["tests", "site_tests", "deps", "profilers"])
+
+ files = []
+ for f in os.listdir(self.source_material):
+ if f not in dirs_to_exclude:
+ files.append(os.path.join(self.source_material, f))
+
+ # We will also add the global configuration files to the bundle
+ root_dir = os.path.dirname(self.serverdir)
+ global_config = os.path.join(root_dir, 'global_config.ini')
+ shadow_config = os.path.join(root_dir, 'shadow_config.ini')
+ files.append(global_config)
+ files.append(shadow_config)
+ # Copy the files to the host
+ host.send_file(files, autodir, delete_dest=True)
# create empty dirs for all the stuff we excluded
commands = []
@@ -165,7 +178,8 @@ class BaseAutotest(installable_object.InstallableObject):
abs_path = utils.sh_escape(abs_path)
commands.append("mkdir -p '%s'" % abs_path)
commands.append("touch '%s'/__init__.py" % abs_path)
- host.run(';'.join(commands))
+ if commands:
+ host.run(';'.join(commands))
def _install(self, host=None, autodir=None, use_autoserv=True,
@@ -223,10 +237,9 @@ class BaseAutotest(installable_object.InstallableObject):
"PACKAGES", "serve_packages_from_autoserv", type=bool)
# Copy autotest recursively
if supports_autoserv_packaging and use_autoserv:
- self._install_using_send_file(host, autodir)
+ self._install_using_send_file(host, autodir, full=False)
else:
- host.send_file(self.source_material, autodir,
- delete_dest=True)
+ self._install_using_send_file(host, autodir, full=True)
else:
# Copy autotest via tarball
e_msg = 'Installation method not yet implemented!'
@@ -77,9 +77,19 @@ def process_packages(pkgmgr, pkg_type, pkg_names, src_dir, repo_url,
names = [p.strip() for p in pkg_names.split(',')]
for name in names:
print "Processing %s ... " % name
+ copy_config = False
if pkg_type=='client':
pkg_dir = src_dir
exclude_string = get_exclude_string(pkg_dir)
+ copy_config = True
+ global_config_src = os.path.join(os.path.dirname(src_dir),
+ 'global_config.ini')
+ shadow_config_src = os.path.join(os.path.dirname(src_dir),
+ 'shadow_config.ini')
+ global_config_dst = os.path.join(src_dir, 'global_config.ini')
+ shadow_config_dst = os.path.join(src_dir, 'shadow_config.ini')
+ shutil.copy(global_config_src, global_config_dst)
+ shutil.copy(shadow_config_src, shadow_config_dst)
elif pkg_type=='test':
# if the package is a test then look whether it is in client/tests
# or client/site_tests
@@ -103,6 +113,9 @@ def process_packages(pkgmgr, pkg_type, pkg_names, src_dir, repo_url,
temp_dir, exclude_string)
pkgmgr.upload_pkg(tarball_path, repo_url, update_checksum=True)
finally:
+ if copy_config:
+ os.unlink(global_config_dst)
+ os.unlink(shadow_config_dst)
# remove the temporary directory
shutil.rmtree(temp_dir)
else:
@@ -129,9 +142,8 @@ def tar_packages(pkgmgr, pkg_type, pkg_names, src_dir, temp_dir):
pkg_dir = os.path.join(src_dir, name)
pkg_name = pkgmgr.get_tarball_name(name, pkg_type)
- tarball_path = pkgmgr.tar_package(pkg_name, pkg_dir,
- temp_dir, exclude_string)
-
+ tarball_path = pkgmgr.tar_package(pkg_name, pkg_dir, temp_dir,
+ exclude_string)
tarballs.append(tarball_path)
return tarballs