blob: 244f7950165bde2c1f2e8a911b778ec1474f8aec [file] [log] [blame]
mblighbe630eb2008-08-01 16:41:48 +00001#
2# Copyright 2008 Google Inc. All Rights Reserved.
3
4"""
5The label module contains the objects and methods used to
6manage labels in Autotest.
7
8The valid actions are:
9add: adds label(s), or hosts to an LABEL
10remove: deletes label(s), or hosts from an LABEL
11list: lists label(s)
12
13The common options are:
14--blist / -B: file containing a list of LABELs
15
16See topic_common.py for a High Level Design and Algorithm.
17"""
18
19import os, sys
20from autotest_lib.cli import topic_common, action_common
21
22
23class label(topic_common.atest):
24 """Label class
25 atest label [create|delete|list|add|remove] <options>"""
26 usage_action = '[create|delete|list|add|remove]'
27 topic = msg_topic = 'label'
28 msg_items = '<labels>'
29
30 def __init__(self):
31 """Add to the parser the options common to all the
32 label actions"""
33 super(label, self).__init__()
34
35 self.parser.add_option('-B', '--blist',
36 help='File listing the labels',
37 type='string',
38 default=None,
39 metavar='LABEL_FLIST')
40
mbligh9deeefa2009-05-01 23:11:08 +000041 self.topic_parse_info = topic_common.item_parse_info(
42 attribute_name='labels',
43 filename_option='blist',
44 use_leftover=True)
mblighbe630eb2008-08-01 16:41:48 +000045
46
47 def get_items(self):
48 return self.labels
49
50
51class label_help(label):
52 """Just here to get the atest logic working.
53 Usage is set by its parent"""
54 pass
55
56
57class label_list(action_common.atest_list, label):
58 """atest label list [--platform] [--all]
59 [--valid-only] [--machine <machine>]
60 [--blist <file>] [<labels>]"""
61 def __init__(self):
62 super(label_list, self).__init__()
63
64 self.parser.add_option('-t', '--platform-only',
65 help='Display only platform labels',
66 action='store_true')
67
68 self.parser.add_option('-d', '--valid-only',
69 help='Display only valid labels',
70 action='store_true')
71
72 self.parser.add_option('-a', '--all',
73 help=('Display both normal & '
74 'platform labels'),
75 action='store_true')
76
77 self.parser.add_option('-m', '--machine',
78 help='List LABELs of MACHINE',
79 type='string',
80 metavar='MACHINE')
81
82
83 def parse(self):
mbligh9deeefa2009-05-01 23:11:08 +000084 host_info = topic_common.item_parse_info(attribute_name='hosts',
85 inline_option='machine')
86 (options, leftover) = super(label_list, self).parse([host_info])
mblighbe630eb2008-08-01 16:41:48 +000087
88 if options.all and options.platform_only:
89 self.invalid_syntax('Only specify one of --all,'
90 '--platform')
91
92 if len(self.hosts) > 1:
93 self.invalid_syntax(('Only one machine name allowed. '
94 '''Use '%s host list %s' '''
95 'instead.') %
96 (sys.argv[0], ','.join(self.hosts)))
97 self.all = options.all
98 self.platform_only = options.platform_only
99 self.valid_only = options.valid_only
100 return (options, leftover)
101
102
103 def execute(self):
104 filters = {}
105 check_results = {}
106 if self.hosts:
107 filters['host__hostname__in'] = self.hosts
108 check_results['host__hostname__in'] = None
109
110 if self.labels:
111 filters['name__in'] = self.labels
112 check_results['name__in'] = 'name'
113
114 return super(label_list, self).execute(op='get_labels',
115 filters=filters,
116 check_results=check_results)
117
118
119 def output(self, results):
120 if self.valid_only:
121 results = [label for label in results
122 if not label['invalid']]
123
124 if self.platform_only:
125 results = [label for label in results
126 if label['platform']]
127 keys = ['name', 'invalid']
128 elif not self.all:
129 results = [label for label in results
130 if not label['platform']]
showard989f25d2008-10-01 11:38:11 +0000131 keys = ['name', 'only_if_needed', 'invalid']
mblighbe630eb2008-08-01 16:41:48 +0000132 else:
showard989f25d2008-10-01 11:38:11 +0000133 keys = ['name', 'platform', 'only_if_needed', 'invalid']
mblighbe630eb2008-08-01 16:41:48 +0000134
135 super(label_list, self).output(results, keys)
136
137
138class label_create(action_common.atest_create, label):
139 """atest label create <labels>|--blist <file> --platform"""
140 def __init__(self):
141 super(label_create, self).__init__()
142 self.parser.add_option('-t', '--platform',
143 help='To create this label as a platform',
144 default=False,
145 action='store_true')
showard989f25d2008-10-01 11:38:11 +0000146 self.parser.add_option('-o', '--only_if_needed',
147 help='To mark the label as "only use if needed',
148 default=False,
149 action='store_true')
mblighbe630eb2008-08-01 16:41:48 +0000150
151
152 def parse(self):
mbligh9deeefa2009-05-01 23:11:08 +0000153 (options, leftover) = super(label_create,
154 self).parse(req_items='labels')
mblighbe630eb2008-08-01 16:41:48 +0000155 self.data_item_key = 'name'
156 self.data['platform'] = options.platform
showard989f25d2008-10-01 11:38:11 +0000157 self.data['only_if_needed'] = options.only_if_needed
mblighbe630eb2008-08-01 16:41:48 +0000158 return (options, leftover)
159
160
161class label_delete(action_common.atest_delete, label):
162 """atest label delete <labels>|--blist <file>"""
163 pass
164
165
166
167class label_add_or_remove(label):
168 def __init__(self):
169 super(label_add_or_remove, self).__init__()
170 lower_words = tuple(word.lower() for word in self.usage_words)
171 self.parser.add_option('-m', '--machine',
172 help=('%s MACHINE(s) %s the LABEL' %
173 self.usage_words),
174 type='string',
175 metavar='MACHINE')
176 self.parser.add_option('-M', '--mlist',
177 help='File containing machines to %s %s '
178 'the LABEL' % lower_words,
179 type='string',
180 metavar='MACHINE_FLIST')
181
182
183 def parse(self):
mbligh9deeefa2009-05-01 23:11:08 +0000184 host_info = topic_common.item_parse_info(attribute_name='hosts',
185 inline_option='machine',
186 filename_option='mlist')
187 (options, leftover) = super(label_add_or_remove,
188 self).parse([host_info],
189 req_items='labels')
190
mblighbe630eb2008-08-01 16:41:48 +0000191 if not getattr(self, 'hosts', None):
192 self.invalid_syntax('%s %s requires at least one host' %
193 (self.msg_topic,
194 self.usage_action))
195 return (options, leftover)
196
197
198class label_add(action_common.atest_add, label_add_or_remove):
199 """atest label add <labels>|--blist <file>
200 --platform [--machine <machine>] [--mlist <file>]"""
201 pass
202
203
204class label_remove(action_common.atest_remove, label_add_or_remove):
205 """atest label remove <labels>|--blist <file>
206 [--machine <machine>] [--mlist <file>]"""
207 pass