# Copyright 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""
This module contains functions to get or update stable version for a given
board.
The valid actions are:
list: Show version of a given board or list all boards and their stable
versions if --board option is not specified.
modify: Set the stable version of a given board to the given value.
delete: Delete the stable version of a given board. So its stable version will
use the value for board `DEFAULT`.
"""
import common
from autotest_lib.cli import topic_common
class stable_version(topic_common.atest):
"""stable_version class
atest stable_version [list|delete|modify] <options>
"""
usage_action = '[list|delete|modify]'
topic = msg_topic = 'stable_version'
msg_items = '<stable_version>'
def __init__(self):
"""Add to the parser the options common to all the
stable_version actions.
"""
super(stable_version, self).__init__()
self.parser.add_option('-b', '--board',
help='Name of the board',
type='string',
default=None,
metavar='BOARD')
self.topic_parse_info = topic_common.item_parse_info(
attribute_name='board', use_leftover=True)
def parse(self):
"""Parse command arguments.
"""
board_info = topic_common.item_parse_info(attribute_name='board')
(options, leftover) = super(stable_version, self).parse([board_info])
self.board = options.board
return (options, leftover)
def output(self, results):
"""Display output.
For most actions, the return is a string message, no formating needed.
@param results: return of the execute call.
"""
if results:
print results
class stable_version_help(stable_version):
"""Just here to get the atest logic working. Usage is set by its parent.
"""
pass
class stable_version_list(stable_version):
"""atest stable_version list [--board <board>]"""
def execute(self):
"""Execute list stable version action.
"""
if self.board:
version = self.execute_rpc(op='get_stable_version',
board=self.board)
return {self.board: version}
else:
return self.execute_rpc(op='get_all_stable_versions')
def output(self, results):
"""Display output.
@param results: A dictionary of board:version.
"""
board_columns = max([len(s) for s in results.keys()])
version_columns = max([len(s) for s in results.values()])
total_columns = board_columns + version_columns + 3
format = '%%-%ds | %%s' % board_columns
print '=' * total_columns
print format % ('board', 'version')
print '-' * total_columns
for board,version in results.iteritems():
print format % (board, version)
print '=' * total_columns
class stable_version_modify(stable_version):
"""atest stable_version modify --board <board> --version <version>
Change the stable version of a given board to the given value.
"""
def __init__(self):
"""Add to the parser the options common to all the
stable_version actions.
"""
super(stable_version_modify, self).__init__()
self.parser.add_option('-i', '--version',
help='Stable version.',
type='string',
metavar='VERSION')
self.topic_parse_info = topic_common.item_parse_info(
attribute_name='board', use_leftover=True)
def parse(self):
"""Parse command arguments.
"""
options,leftover = super(stable_version_modify, self).parse()
self.version = options.version
if not self.board or not self.version:
self.invalid_syntax('Both --board and --version arguments must be '
'specified.')
def execute(self):
"""Execute delete stable version action.
"""
current_version = self.execute_rpc(op='get_stable_version',
board=self.board)
if current_version == self.version:
print ('Board %s already has stable version of %s.' %
(self.board, self.version))
return
self.execute_rpc(op='set_stable_version', board=self.board,
version=self.version)
print ('Stable version for board %s is changed from %s to %s.' %
(self.board, current_version, self.version))
class stable_version_delete(stable_version):
"""atest stable_version delete --board <board>
Delete a stable version entry in afe_stable_versions table for a given
board, so default stable version will be used.
"""
def parse(self):
"""Parse command arguments.
"""
super(stable_version_delete, self).parse()
if not self.board:
self.invalid_syntax('`board` argument must be specified to delete '
'a stable version entry.')
if self.board == 'DEFAULT':
self.invalid_syntax('Stable version for board DEFAULT can not be '
'deleted.')
@topic_common.atest.require_confirmation(
'Are you sure to delete stable version for the given board?')
def execute(self):
"""Execute delete stable version action.
"""
self.execute_rpc(op='delete_stable_version', board=self.board)
print 'Stable version for board %s is deleted.' % self.board
default_stable_version = self.execute_rpc(op='get_stable_version')
print ('Stable version for board %s is default to %s' %
(self.board, default_stable_version))