Home | History | Annotate | Download | only in lxc
      1 # Copyright 2015 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import os
      6 
      7 import common
      8 from autotest_lib.client.bin import utils as common_utils
      9 from autotest_lib.client.common_lib.global_config import global_config
     10 
     11 
     12 # Name of the base container.
     13 BASE = global_config.get_config_value('AUTOSERV', 'container_base_name')
     14 
     15 # Path to folder that contains autotest code inside container.
     16 CONTAINER_AUTOTEST_DIR = '/usr/local/autotest'
     17 
     18 # Naming convention of test container, e.g., test_300_1422862512_2424, where:
     19 # 300:        The test job ID.
     20 # 1422862512: The tick when container is created.
     21 # 2424:       The PID of autoserv that starts the container.
     22 TEST_CONTAINER_NAME_FMT = 'test_%s_%d_%d'
     23 # Naming convention of the result directory in test container.
     24 RESULT_DIR_FMT = os.path.join(CONTAINER_AUTOTEST_DIR, 'results',
     25                               '%s')
     26 # Attributes to retrieve about containers.
     27 ATTRIBUTES = ['name', 'state']
     28 
     29 # Format for mount entry to share a directory in host with container.
     30 # source is the directory in host, destination is the directory in container.
     31 # readonly is a binding flag for readonly mount, its value should be `,ro`.
     32 MOUNT_FMT = ('lxc.mount.entry = %(source)s %(destination)s none '
     33              'bind%(readonly)s 0 0')
     34 SSP_ENABLED = global_config.get_config_value('AUTOSERV', 'enable_ssp_container',
     35                                              type=bool, default=True)
     36 # url to the folder stores base container.
     37 CONTAINER_BASE_FOLDER_URL = global_config.get_config_value('AUTOSERV',
     38                                                     'container_base_folder_url')
     39 CONTAINER_BASE_URL_FMT = '%s/%%s.tar.xz' % CONTAINER_BASE_FOLDER_URL
     40 CONTAINER_BASE_URL = CONTAINER_BASE_URL_FMT % BASE
     41 # Default directory used to store LXC containers.
     42 DEFAULT_CONTAINER_PATH = global_config.get_config_value('AUTOSERV',
     43                                                         'container_path')
     44 # Default directory for host mounts
     45 DEFAULT_SHARED_HOST_PATH = global_config.get_config_value(
     46         'AUTOSERV',
     47         'container_shared_host_path')
     48 
     49 # Path to drone_temp folder in the container, which stores the control file for
     50 # test job to run.
     51 CONTROL_TEMP_PATH = os.path.join(CONTAINER_AUTOTEST_DIR, 'drone_tmp')
     52 
     53 # Bash command to return the file count in a directory. Test the existence first
     54 # so the command can return an error code if the directory doesn't exist.
     55 COUNT_FILE_CMD = '[ -d %(dir)s ] && ls %(dir)s | wc -l'
     56 
     57 # Command line to append content to a file
     58 APPEND_CMD_FMT = ('echo \'%(content)s\' | sudo tee --append %(file)s'
     59                   '> /dev/null')
     60 
     61 # Flag to indicate it's running in a Moblab. Due to crbug.com/457496, lxc-ls has
     62 # different behavior in Moblab.
     63 IS_MOBLAB = common_utils.is_moblab()
     64 
     65 if IS_MOBLAB:
     66     SITE_PACKAGES_PATH = '/usr/lib64/python2.7/site-packages'
     67     CONTAINER_SITE_PACKAGES_PATH = '/usr/local/lib/python2.7/dist-packages/'
     68 else:
     69     SITE_PACKAGES_PATH = os.path.join(common.autotest_dir, 'site-packages')
     70     CONTAINER_SITE_PACKAGES_PATH = os.path.join(CONTAINER_AUTOTEST_DIR,
     71                                                 'site-packages')
     72 
     73 # TODO(dshi): If we are adding more logic in how lxc should interact with
     74 # different systems, we should consider code refactoring to use a setting-style
     75 # object to store following flags mapping to different systems.
     76 # TODO(crbug.com/464834): Snapshot clone is disabled until Moblab can
     77 # support overlayfs or aufs, which requires a newer kernel.
     78 SUPPORT_SNAPSHOT_CLONE = not IS_MOBLAB
     79 
     80 # Number of seconds to wait for network to be up in a container.
     81 NETWORK_INIT_TIMEOUT = 300
     82 # Network bring up is slower in Moblab.
     83 NETWORK_INIT_CHECK_INTERVAL = 2 if IS_MOBLAB else 0.1
     84 
     85 # Number of seconds to download files from devserver. We chose a timeout that
     86 # is on the same order as the permitted CTS runtime for normal jobs (1h). In
     87 # principle we should not retry timeouts as they indicate server/network
     88 # overload, but we may be tempted to retry for other failures.
     89 DEVSERVER_CALL_TIMEOUT = 3600
     90 # Number of retries to download files from devserver. There is no point in
     91 # having more than one retry for a file download.
     92 DEVSERVER_CALL_RETRY = 2
     93 # Average delay before attempting a retry to download from devserver. This
     94 # value needs to be large enough to allow an overloaded server/network to
     95 # calm down even in the face of retries.
     96 DEVSERVER_CALL_DELAY = 600
     97 
     98 # Type string for container related metadata.
     99 CONTAINER_CREATE_METADB_TYPE = 'container_create'
    100 CONTAINER_CREATE_RETRY_METADB_TYPE = 'container_create_retry'
    101 CONTAINER_RUN_TEST_METADB_TYPE = 'container_run_test'
    102 
    103 # The container's hostname MUST start with `test-` or `test_`. DHCP server in
    104 # MobLab uses that prefix to determine the lease time.  Note that `test_` is not
    105 # a valid hostname as hostnames cannot contain underscores.  Work is underway to
    106 # migrate to `test-`.  See crbug/726131.
    107 CONTAINER_UTSNAME_FORMAT = 'test-%s'
    108 
    109 STATS_KEY = 'chromeos/autotest/lxc'
    110