| |
| """ |
| The atomicgroup module contains the objects and methods used to |
| manage atomic groups in Autotest. |
| |
| The valid actions are: |
| create: Create a new atomic group. |
| delete: Delete (invalidate) an existing atomic group. |
| list: Lists atomic groups. |
| add: Adds labels to an atomic group. |
| remove: Removes labels from an atomic group. |
| |
| See topic_common.py for a High Level Design and Algorithm. |
| """ |
| |
| import os, sys |
| from autotest_lib.cli import topic_common, action_common |
| |
| class atomicgroup(topic_common.atest): |
| """ |
| Atomic group class |
| |
| atest atomicgroup [create|delete|list|add|remove] <options> |
| """ |
| usage_action = '[create|delete|list|add|remove]' |
| topic = 'atomic_group' |
| msg_topic = 'atomicgroup' |
| msg_items = '<atomicgroups>' |
| |
| |
| def __init__(self): |
| super(atomicgroup, self).__init__() |
| self.parser.add_option('-G', '--glist', |
| help='File listing the ATOMIC GROUPs', |
| type='string', default=None, |
| metavar='ATOMIC_GROUP_FLIST') |
| |
| self.topic_parse_info = topic_common.item_parse_info( |
| attribute_name='atomicgroups', |
| filename_option='glist', |
| use_leftover=True) |
| |
| |
| def get_items(self): |
| return self.atomicgroups |
| |
| |
| class atomicgroup_help(atomicgroup): |
| """Just to get the atest logic working. Usage is set by its parent.""" |
| pass |
| |
| |
| class atomicgroup_list(action_common.atest_list, atomicgroup): |
| """atest atomicgroup list [--show-invalid]""" |
| def __init__(self): |
| super(atomicgroup_list, self).__init__() |
| self.parser.add_option('-d', '--show-invalid', |
| help='Don\'t hide invalid atomic groups.', |
| action='store_true') |
| |
| |
| def parse(self): |
| options, leftover = super(atomicgroup_list, self).parse() |
| self.show_invalid = options.show_invalid |
| return options, leftover |
| |
| |
| def execute(self): |
| return super(atomicgroup_list, self).execute(op='get_atomic_groups') |
| |
| |
| def output(self, results): |
| if not self.show_invalid: |
| results = [atomicgroup for atomicgroup in results |
| if not atomicgroup['invalid']] |
| |
| keys = ['name', 'description', 'max_number_of_machines', 'invalid'] |
| super(atomicgroup_list, self).output(results, keys) |
| |
| |
| class atomicgroup_create(action_common.atest_create, atomicgroup): |
| def __init__(self): |
| super(atomicgroup_create, self).__init__() |
| self.parser.add_option('-n', '--max_number_of_machines', |
| help='Maximum # of machines for this group.', |
| type='int', default=None) |
| self.parser.add_option('-d', '--description', |
| help='Description of this atomic group.', |
| type='string', default='') |
| |
| |
| def parse(self): |
| options, leftover = super(atomicgroup_create, self).parse() |
| self.data_item_key = 'name' |
| self.data['description'] = options.description |
| self.data['max_number_of_machines'] = options.max_number_of_machines |
| return options, leftover |
| |
| |
| class atomicgroup_delete(action_common.atest_delete, atomicgroup): |
| """atest atomicgroup delete <atomicgroup>""" |
| pass |
| |
| |
| class atomicgroup_add_or_remove(atomicgroup): |
| |
| def __init__(self): |
| super(atomicgroup_add_or_remove, self).__init__() |
| # .add_remove_things is used by action_common.atest_add_or_remove. |
| self.add_remove_things = {'labels': 'label'} |
| lower_words = tuple(word.lower() for word in self.usage_words) |
| self.parser.add_option('-l', '--label', |
| help=('%s LABELS(s) %s the ATOMIC GROUP.' % |
| self.usage_words), |
| type='string', |
| metavar='LABEL') |
| self.parser.add_option('-L', '--label_list', |
| help='File containing LABELs to %s %s ' |
| 'the ATOMIC GROUP.' % lower_words, |
| type='string', |
| metavar='LABEL_FLIST') |
| |
| |
| def parse(self): |
| label_info = topic_common.item_parse_info(attribute_name='labels', |
| inline_option='label', |
| filename_option='label_list') |
| |
| options, leftover = super(atomicgroup_add_or_remove, |
| self).parse([label_info], |
| req_items='atomicgroups') |
| if not getattr(self, 'labels', None): |
| self.invalid_syntax('%s %s requires at least one label' % |
| (self.msg_topic, |
| self.usage_action)) |
| return options, leftover |
| |
| |
| class atomicgroup_add(action_common.atest_add, atomicgroup_add_or_remove): |
| """atest atomicgroup add <atomicgroup> |
| [--label <label>] [--label_list <file>]""" |
| pass |
| |
| |
| class atomicgroup_remove(action_common.atest_remove, atomicgroup_add_or_remove): |
| """atest atomicgroup remove <atomicgroup> |
| [--label <label>] [--label_list <file>]""" |
| pass |