""" 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