2 # Copyright 2008 Google Inc. All Rights Reserved.
5 The label module contains the objects and methods used to
6 manage labels in Autotest.
9 add: adds label(s), or hosts to an LABEL
10 remove: deletes label(s), or hosts from an LABEL
13 The common options are:
14 --blist / -B: file containing a list of LABELs
16 See topic_common.py for a High Level Design and Algorithm.
20 from autotest_lib
.cli
import topic_common
, action_common
23 class label(topic_common
.atest
):
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>'
31 """Add to the parser the options common to all the
33 super(label
, self
).__init
__()
35 self
.parser
.add_option('-B', '--blist',
36 help='File listing the labels',
39 metavar
='LABEL_FLIST')
41 self
.topic_parse_info
= topic_common
.item_parse_info(
42 attribute_name
='labels',
43 filename_option
='blist',
51 class label_help(label
):
52 """Just here to get the atest logic working.
53 Usage is set by its parent"""
57 class label_list(action_common
.atest_list
, label
):
58 """atest label list [--platform] [--all] [--atomicgroup]
59 [--valid-only] [--machine <machine>]
60 [--blist <file>] [<labels>]"""
62 super(label_list
, self
).__init
__()
64 self
.parser
.add_option('-t', '--platform-only',
65 help='Display only platform labels',
68 self
.parser
.add_option('-d', '--valid-only',
69 help='Display only valid labels',
72 self
.parser
.add_option('-a', '--all',
73 help=('Display both normal & '
77 self
.parser
.add_option('--atomicgroup',
78 help=('Display only atomic group labels '
79 'along with the atomic group name.'),
82 self
.parser
.add_option('-m', '--machine',
83 help='List LABELs of MACHINE',
89 host_info
= topic_common
.item_parse_info(attribute_name
='hosts',
90 inline_option
='machine')
91 (options
, leftover
) = super(label_list
, self
).parse([host_info
])
93 exclusives
= [options
.all
, options
.platform_only
, options
.atomicgroup
]
94 if exclusives
.count(True) > 1:
95 self
.invalid_syntax('Only specify one of --all,'
96 '--platform, --atomicgroup')
98 if len(self
.hosts
) > 1:
99 self
.invalid_syntax(('Only one machine name allowed. '
100 '''Use '%s host list %s' '''
102 (sys
.argv
[0], ','.join(self
.hosts
)))
103 self
.all
= options
.all
104 self
.atomicgroup
= options
.atomicgroup
105 self
.platform_only
= options
.platform_only
106 self
.valid_only
= options
.valid_only
107 return (options
, leftover
)
114 filters
['host__hostname__in'] = self
.hosts
115 check_results
['host__hostname__in'] = None
118 filters
['name__in'] = self
.labels
119 check_results
['name__in'] = 'name'
121 return super(label_list
, self
).execute(op
='get_labels',
123 check_results
=check_results
)
126 def output(self
, results
):
128 results
= [label
for label
in results
129 if not label
['invalid']]
131 if self
.platform_only
:
132 results
= [label
for label
in results
133 if label
['platform']]
134 keys
= ['name', 'invalid']
135 elif self
.atomicgroup
:
136 results
= [label
for label
in results
137 if label
['atomic_group']]
138 keys
= ['name', 'atomic_group.name', 'invalid']
140 results
= [label
for label
in results
141 if not label
['platform']]
142 keys
= ['name', 'only_if_needed', 'invalid']
144 keys
= ['name', 'platform', 'only_if_needed', 'invalid']
146 super(label_list
, self
).output(results
, keys
)
149 class label_create(action_common
.atest_create
, label
):
150 """atest label create <labels>|--blist <file> --platform"""
152 super(label_create
, self
).__init
__()
153 self
.parser
.add_option('-t', '--platform',
154 help='To create this label as a platform',
157 self
.parser
.add_option('-o', '--only_if_needed',
158 help='To mark the label as "only use if needed',
164 (options
, leftover
) = super(label_create
,
165 self
).parse(req_items
='labels')
166 self
.data_item_key
= 'name'
167 self
.data
['platform'] = options
.platform
168 self
.data
['only_if_needed'] = options
.only_if_needed
169 return (options
, leftover
)
172 class label_delete(action_common
.atest_delete
, label
):
173 """atest label delete <labels>|--blist <file>"""
178 class label_add_or_remove(label
):
180 super(label_add_or_remove
, self
).__init
__()
181 lower_words
= tuple(word
.lower() for word
in self
.usage_words
)
182 self
.parser
.add_option('-m', '--machine',
183 help=('%s MACHINE(s) %s the LABEL' %
187 self
.parser
.add_option('-M', '--mlist',
188 help='File containing machines to %s %s '
189 'the LABEL' % lower_words
,
191 metavar
='MACHINE_FLIST')
195 host_info
= topic_common
.item_parse_info(attribute_name
='hosts',
196 inline_option
='machine',
197 filename_option
='mlist')
198 (options
, leftover
) = super(label_add_or_remove
,
199 self
).parse([host_info
],
202 if not getattr(self
, 'hosts', None):
203 self
.invalid_syntax('%s %s requires at least one host' %
206 return (options
, leftover
)
209 class label_add(action_common
.atest_add
, label_add_or_remove
):
210 """atest label add <labels>|--blist <file>
211 --platform [--machine <machine>] [--mlist <file>]"""
215 class label_remove(action_common
.atest_remove
, label_add_or_remove
):
216 """atest label remove <labels>|--blist <file>
217 [--machine <machine>] [--mlist <file>]"""