| # 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)) |