16964fa53798525f39cd490e26481e8d923815406Dan Shi# Copyright 2014 The Chromium OS Authors. All rights reserved.
26964fa53798525f39cd490e26481e8d923815406Dan Shi# Use of this source code is governed by a BSD-style license that can be
36964fa53798525f39cd490e26481e8d923815406Dan Shi# found in the LICENSE file.
46964fa53798525f39cd490e26481e8d923815406Dan Shi
56964fa53798525f39cd490e26481e8d923815406Dan Shi# This file contains utility functions to get and set stable versions for given
66964fa53798525f39cd490e26481e8d923815406Dan Shi# boards.
76964fa53798525f39cd490e26481e8d923815406Dan Shi
86964fa53798525f39cd490e26481e8d923815406Dan Shiimport common
96964fa53798525f39cd490e26481e8d923815406Dan Shiimport django.core.exceptions
106964fa53798525f39cd490e26481e8d923815406Dan Shifrom autotest_lib.client.common_lib import global_config
11b72f4fbcf1583da27f09f4abb9d8162530bf4559Gabe Blackfrom autotest_lib.client.common_lib.cros.graphite import autotest_es
126964fa53798525f39cd490e26481e8d923815406Dan Shifrom autotest_lib.frontend import setup_django_environment
136964fa53798525f39cd490e26481e8d923815406Dan Shifrom autotest_lib.frontend.afe import models
146964fa53798525f39cd490e26481e8d923815406Dan Shi
156964fa53798525f39cd490e26481e8d923815406Dan Shi
166964fa53798525f39cd490e26481e8d923815406Dan Shi# Name of the default board. For boards that don't have stable version
176964fa53798525f39cd490e26481e8d923815406Dan Shi# explicitly set, version for the default board will be used.
186964fa53798525f39cd490e26481e8d923815406Dan ShiDEFAULT = 'DEFAULT'
196964fa53798525f39cd490e26481e8d923815406Dan Shi
2025e1fd446390578299d7b7da0f84914a0728c5fcDan Shi# Type of metadata to store stable_version changes.
2125e1fd446390578299d7b7da0f84914a0728c5fcDan Shi_STABLE_VERSION_TYPE = 'stable_version'
2225e1fd446390578299d7b7da0f84914a0728c5fcDan Shi
236964fa53798525f39cd490e26481e8d923815406Dan Shidef get_all():
246964fa53798525f39cd490e26481e8d923815406Dan Shi    """Get stable versions of all boards.
256964fa53798525f39cd490e26481e8d923815406Dan Shi
266964fa53798525f39cd490e26481e8d923815406Dan Shi    @return: A dictionary of boards and stable versions.
276964fa53798525f39cd490e26481e8d923815406Dan Shi    """
2825e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    versions = dict([(v.board, v.version)
2925e1fd446390578299d7b7da0f84914a0728c5fcDan Shi                     for v in models.StableVersion.objects.all()])
3025e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    # Set default to the global config value of CROS.stable_cros_version if
3125e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    # there is no entry in afe_stable_versions table.
3225e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    if not versions:
3325e1fd446390578299d7b7da0f84914a0728c5fcDan Shi        versions = {DEFAULT: global_config.global_config.get_config_value(
3425e1fd446390578299d7b7da0f84914a0728c5fcDan Shi                            'CROS', 'stable_cros_version')}
3525e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    return versions
366964fa53798525f39cd490e26481e8d923815406Dan Shi
376964fa53798525f39cd490e26481e8d923815406Dan Shi
38beb2bb20028027fa31c2790e54619c82f4d51422Simran Basidef get(board=DEFAULT, android=False):
396964fa53798525f39cd490e26481e8d923815406Dan Shi    """Get stable version for the given board.
406964fa53798525f39cd490e26481e8d923815406Dan Shi
416964fa53798525f39cd490e26481e8d923815406Dan Shi    @param board: Name of the board, default to value `DEFAULT`.
42beb2bb20028027fa31c2790e54619c82f4d51422Simran Basi    @param android: If True, indicates we are looking up a Android/Brillo-based
43beb2bb20028027fa31c2790e54619c82f4d51422Simran Basi                    board. There is no default version that works for all
44beb2bb20028027fa31c2790e54619c82f4d51422Simran Basi                    Android/Brillo boards. If False, we are looking up a Chrome
45beb2bb20028027fa31c2790e54619c82f4d51422Simran Basi                    OS based board.
46beb2bb20028027fa31c2790e54619c82f4d51422Simran Basi
4725e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    @return: Stable version of the given board. If the given board is not listed
4825e1fd446390578299d7b7da0f84914a0728c5fcDan Shi             in afe_stable_versions table, DEFAULT will be used.
4925e1fd446390578299d7b7da0f84914a0728c5fcDan Shi             Return global_config value of CROS.stable_cros_version if
5025e1fd446390578299d7b7da0f84914a0728c5fcDan Shi             afe_stable_versions table does not have entry of board DEFAULT.
516964fa53798525f39cd490e26481e8d923815406Dan Shi    """
52beb2bb20028027fa31c2790e54619c82f4d51422Simran Basi    if board == DEFAULT and android:
53beb2bb20028027fa31c2790e54619c82f4d51422Simran Basi        return None
546964fa53798525f39cd490e26481e8d923815406Dan Shi    try:
556964fa53798525f39cd490e26481e8d923815406Dan Shi        return models.StableVersion.objects.get(board=board).version
566964fa53798525f39cd490e26481e8d923815406Dan Shi    except django.core.exceptions.ObjectDoesNotExist:
576964fa53798525f39cd490e26481e8d923815406Dan Shi        if board == DEFAULT:
586964fa53798525f39cd490e26481e8d923815406Dan Shi            return global_config.global_config.get_config_value(
596964fa53798525f39cd490e26481e8d923815406Dan Shi                    'CROS', 'stable_cros_version')
60beb2bb20028027fa31c2790e54619c82f4d51422Simran Basi        elif android:
61beb2bb20028027fa31c2790e54619c82f4d51422Simran Basi            return global_config.global_config.get_config_value(
62beb2bb20028027fa31c2790e54619c82f4d51422Simran Basi                    'ANDROID', 'stable_version_%s' % board, default=None)
636964fa53798525f39cd490e26481e8d923815406Dan Shi        else:
6425e1fd446390578299d7b7da0f84914a0728c5fcDan Shi            return get(board=DEFAULT)
6525e1fd446390578299d7b7da0f84914a0728c5fcDan Shi
6625e1fd446390578299d7b7da0f84914a0728c5fcDan Shi
6725e1fd446390578299d7b7da0f84914a0728c5fcDan Shidef set(version, board=DEFAULT):
6825e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    """Set stable version for the given board.
6925e1fd446390578299d7b7da0f84914a0728c5fcDan Shi
7025e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    @param version: The new value of stable version for given board.
7125e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    @param board: Name of the board, default to value `DEFAULT`.
7225e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    """
7325e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    try:
7425e1fd446390578299d7b7da0f84914a0728c5fcDan Shi        stable_version = models.StableVersion.objects.get(board=board)
7525e1fd446390578299d7b7da0f84914a0728c5fcDan Shi        stable_version.version = version
7625e1fd446390578299d7b7da0f84914a0728c5fcDan Shi        stable_version.save()
7725e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    except django.core.exceptions.ObjectDoesNotExist:
7825e1fd446390578299d7b7da0f84914a0728c5fcDan Shi        models.StableVersion.objects.create(board=board, version=version)
79b72f4fbcf1583da27f09f4abb9d8162530bf4559Gabe Black    autotest_es.post(type_str=_STABLE_VERSION_TYPE,
80b72f4fbcf1583da27f09f4abb9d8162530bf4559Gabe Black                     metadata={'board': board, 'version': version})
8125e1fd446390578299d7b7da0f84914a0728c5fcDan Shi
8225e1fd446390578299d7b7da0f84914a0728c5fcDan Shi
8325e1fd446390578299d7b7da0f84914a0728c5fcDan Shidef delete(board):
8425e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    """Delete stable version record for the given board.
8525e1fd446390578299d7b7da0f84914a0728c5fcDan Shi
8625e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    @param board: Name of the board.
8725e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    """
8825e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    stable_version = models.StableVersion.objects.get(board=board)
8925e1fd446390578299d7b7da0f84914a0728c5fcDan Shi    stable_version.delete()
90b72f4fbcf1583da27f09f4abb9d8162530bf4559Gabe Black    autotest_es.post(type_str=_STABLE_VERSION_TYPE,
91b72f4fbcf1583da27f09f4abb9d8162530bf4559Gabe Black                     metadata={'board': board, 'version': get()})
92