showard | fb64e6a | 2009-04-22 21:01:18 +0000 | [diff] [blame] | 1 | |
| 2 | """ |
| 3 | The atomicgroup module contains the objects and methods used to |
| 4 | manage atomic groups in Autotest. |
| 5 | |
| 6 | The valid actions are: |
| 7 | create: Create a new atomic group. |
| 8 | delete: Delete (invalidate) an existing atomic group. |
| 9 | list: Lists atomic groups. |
| 10 | add: Adds labels to an atomic group. |
| 11 | remove: Removes labels from an atomic group. |
| 12 | |
| 13 | See topic_common.py for a High Level Design and Algorithm. |
| 14 | """ |
| 15 | |
| 16 | import os, sys |
| 17 | from autotest_lib.cli import topic_common, action_common |
| 18 | |
| 19 | class atomicgroup(topic_common.atest): |
| 20 | """ |
| 21 | Atomic group class |
| 22 | |
| 23 | atest atomicgroup [create|delete|list|add|remove] <options> |
| 24 | """ |
| 25 | usage_action = '[create|delete|list|add|remove]' |
| 26 | topic = 'atomic_group' |
| 27 | msg_topic = 'atomicgroup' |
| 28 | msg_items = '<atomicgroups>' |
| 29 | |
| 30 | |
| 31 | def __init__(self): |
| 32 | super(atomicgroup, self).__init__() |
| 33 | self.parser.add_option('-G', '--glist', |
| 34 | help='File listing the ATOMIC GROUPs', |
| 35 | type='string', default=None, |
| 36 | metavar='ATOMIC_GROUP_FLIST') |
| 37 | |
mbligh | 9deeefa | 2009-05-01 23:11:08 +0000 | [diff] [blame] | 38 | self.topic_parse_info = topic_common.item_parse_info( |
| 39 | attribute_name='atomicgroups', |
| 40 | filename_option='glist', |
| 41 | use_leftover=True) |
showard | fb64e6a | 2009-04-22 21:01:18 +0000 | [diff] [blame] | 42 | |
| 43 | |
| 44 | def get_items(self): |
| 45 | return self.atomicgroups |
| 46 | |
| 47 | |
| 48 | class atomicgroup_help(atomicgroup): |
| 49 | """Just to get the atest logic working. Usage is set by its parent.""" |
| 50 | pass |
| 51 | |
| 52 | |
| 53 | class atomicgroup_list(action_common.atest_list, atomicgroup): |
| 54 | """atest atomicgroup list [--show-invalid]""" |
| 55 | def __init__(self): |
| 56 | super(atomicgroup_list, self).__init__() |
| 57 | self.parser.add_option('-d', '--show-invalid', |
| 58 | help='Don\'t hide invalid atomic groups.', |
| 59 | action='store_true') |
| 60 | |
| 61 | |
| 62 | def parse(self): |
mbligh | 9deeefa | 2009-05-01 23:11:08 +0000 | [diff] [blame] | 63 | options, leftover = super(atomicgroup_list, self).parse() |
showard | fb64e6a | 2009-04-22 21:01:18 +0000 | [diff] [blame] | 64 | self.show_invalid = options.show_invalid |
| 65 | return options, leftover |
| 66 | |
| 67 | |
| 68 | def execute(self): |
| 69 | return super(atomicgroup_list, self).execute(op='get_atomic_groups') |
| 70 | |
| 71 | |
| 72 | def output(self, results): |
| 73 | if not self.show_invalid: |
| 74 | results = [atomicgroup for atomicgroup in results |
| 75 | if not atomicgroup['invalid']] |
| 76 | |
| 77 | keys = ['name', 'description', 'max_number_of_machines', 'invalid'] |
| 78 | super(atomicgroup_list, self).output(results, keys) |
| 79 | |
| 80 | |
| 81 | class atomicgroup_create(action_common.atest_create, atomicgroup): |
| 82 | def __init__(self): |
| 83 | super(atomicgroup_create, self).__init__() |
| 84 | self.parser.add_option('-n', '--max_number_of_machines', |
| 85 | help='Maximum # of machines for this group.', |
showard | e9450c9 | 2009-06-30 01:58:52 +0000 | [diff] [blame] | 86 | type='int', default=None) |
showard | fb64e6a | 2009-04-22 21:01:18 +0000 | [diff] [blame] | 87 | self.parser.add_option('-d', '--description', |
| 88 | help='Description of this atomic group.', |
showard | e9450c9 | 2009-06-30 01:58:52 +0000 | [diff] [blame] | 89 | type='string', default='') |
showard | fb64e6a | 2009-04-22 21:01:18 +0000 | [diff] [blame] | 90 | |
| 91 | |
| 92 | def parse(self): |
| 93 | options, leftover = super(atomicgroup_create, self).parse() |
| 94 | self.data_item_key = 'name' |
| 95 | self.data['description'] = options.description |
| 96 | self.data['max_number_of_machines'] = options.max_number_of_machines |
| 97 | return options, leftover |
| 98 | |
| 99 | |
| 100 | class atomicgroup_delete(action_common.atest_delete, atomicgroup): |
| 101 | """atest atomicgroup delete <atomicgroup>""" |
| 102 | pass |
| 103 | |
| 104 | |
| 105 | class atomicgroup_add_or_remove(atomicgroup): |
| 106 | |
| 107 | def __init__(self): |
| 108 | super(atomicgroup_add_or_remove, self).__init__() |
| 109 | # .add_remove_things is used by action_common.atest_add_or_remove. |
| 110 | self.add_remove_things = {'labels': 'label'} |
| 111 | lower_words = tuple(word.lower() for word in self.usage_words) |
| 112 | self.parser.add_option('-l', '--label', |
| 113 | help=('%s LABELS(s) %s the ATOMIC GROUP.' % |
| 114 | self.usage_words), |
| 115 | type='string', |
| 116 | metavar='LABEL') |
| 117 | self.parser.add_option('-L', '--label_list', |
| 118 | help='File containing LABELs to %s %s ' |
| 119 | 'the ATOMIC GROUP.' % lower_words, |
| 120 | type='string', |
| 121 | metavar='LABEL_FLIST') |
| 122 | |
| 123 | |
| 124 | def parse(self): |
mbligh | 9deeefa | 2009-05-01 23:11:08 +0000 | [diff] [blame] | 125 | label_info = topic_common.item_parse_info(attribute_name='labels', |
| 126 | inline_option='label', |
| 127 | filename_option='label_list') |
| 128 | |
| 129 | options, leftover = super(atomicgroup_add_or_remove, |
| 130 | self).parse([label_info], |
| 131 | req_items='atomicgroups') |
showard | fb64e6a | 2009-04-22 21:01:18 +0000 | [diff] [blame] | 132 | if not getattr(self, 'labels', None): |
| 133 | self.invalid_syntax('%s %s requires at least one label' % |
| 134 | (self.msg_topic, |
| 135 | self.usage_action)) |
| 136 | return options, leftover |
| 137 | |
| 138 | |
| 139 | class atomicgroup_add(action_common.atest_add, atomicgroup_add_or_remove): |
| 140 | """atest atomicgroup add <atomicgroup> |
| 141 | [--label <label>] [--label_list <file>]""" |
| 142 | pass |
| 143 | |
| 144 | |
| 145 | class atomicgroup_remove(action_common.atest_remove, atomicgroup_add_or_remove): |
| 146 | """atest atomicgroup remove <atomicgroup> |
| 147 | [--label <label>] [--label_list <file>]""" |
| 148 | pass |