# # Copyright 2008 Google Inc. All Rights Reserved. """ The label module contains the objects and methods used to manage labels in Autotest. The valid actions are: add: adds label(s), or hosts to an LABEL remove: deletes label(s), or hosts from an LABEL list: lists label(s) The common options are: --blist / -B: file containing a list of LABELs See topic_common.py for a High Level Design and Algorithm. """ import os, sys from autotest_lib.cli import topic_common, action_common class label(topic_common.atest): """Label class atest label [create|delete|list|add|remove] <options>""" usage_action = '[create|delete|list|add|remove]' topic = msg_topic = 'label' msg_items = '<labels>' def __init__(self): """Add to the parser the options common to all the label actions""" super(label, self).__init__() self.parser.add_option('-B', '--blist', help='File listing the labels', type='string', default=None, metavar='LABEL_FLIST') self.topic_parse_info = topic_common.item_parse_info( attribute_name='labels', filename_option='blist', use_leftover=True) def get_items(self): return self.labels class label_help(label): """Just here to get the atest logic working. Usage is set by its parent""" pass class label_list(action_common.atest_list, label): """atest label list [--platform] [--all] [--atomicgroup] [--valid-only] [--machine <machine>] [--blist <file>] [<labels>]""" def __init__(self): super(label_list, self).__init__() self.parser.add_option('-t', '--platform-only', help='Display only platform labels', action='store_true') self.parser.add_option('-d', '--valid-only', help='Display only valid labels', action='store_true') self.parser.add_option('-a', '--all', help=('Display both normal & ' 'platform labels'), action='store_true') self.parser.add_option('--atomicgroup', help=('Display only atomic group labels ' 'along with the atomic group name.'), action='store_true') self.parser.add_option('-m', '--machine', help='List LABELs of MACHINE', type='string', metavar='MACHINE') def parse(self): host_info = topic_common.item_parse_info(attribute_name='hosts', inline_option='machine') (options, leftover) = super(label_list, self).parse([host_info]) exclusives = [options.all, options.platform_only, options.atomicgroup] if exclusives.count(True) > 1: self.invalid_syntax('Only specify one of --all,' '--platform, --atomicgroup') if len(self.hosts) > 1: self.invalid_syntax(('Only one machine name allowed. ' '''Use '%s host list %s' ''' 'instead.') % (sys.argv[0], ','.join(self.hosts))) self.all = options.all self.atomicgroup = options.atomicgroup self.platform_only = options.platform_only self.valid_only = options.valid_only return (options, leftover) def execute(self): filters = {} check_results = {} if self.hosts: filters['host__hostname__in'] = self.hosts check_results['host__hostname__in'] = None if self.labels: filters['name__in'] = self.labels check_results['name__in'] = 'name' return super(label_list, self).execute(op='get_labels', filters=filters, check_results=check_results) def output(self, results): if self.valid_only: results = [label for label in results if not label['invalid']] if self.platform_only: results = [label for label in results if label['platform']] keys = ['name', 'invalid'] elif self.atomicgroup: results = [label for label in results if label['atomic_group']] keys = ['name', 'atomic_group.name', 'invalid'] elif not self.all: results = [label for label in results if not label['platform']] keys = ['name', 'only_if_needed', 'invalid'] else: keys = ['name', 'platform', 'only_if_needed', 'invalid'] super(label_list, self).output(results, keys) class label_create(action_common.atest_create, label): """atest label create <labels>|--blist <file> --platform""" def __init__(self): super(label_create, self).__init__() self.parser.add_option('-t', '--platform', help='To create this label as a platform', default=False, action='store_true') self.parser.add_option('-o', '--only_if_needed', help='To mark the label as "only use if needed', default=False, action='store_true') def parse(self): (options, leftover) = super(label_create, self).parse(req_items='labels') self.data_item_key = 'name' self.data['platform'] = options.platform self.data['only_if_needed'] = options.only_if_needed return (options, leftover) class label_delete(action_common.atest_delete, label): """atest label delete <labels>|--blist <file>""" pass class label_add_or_remove(label): def __init__(self): super(label_add_or_remove, self).__init__() lower_words = tuple(word.lower() for word in self.usage_words) self.parser.add_option('-m', '--machine', help=('%s MACHINE(s) %s the LABEL' % self.usage_words), type='string', metavar='MACHINE') self.parser.add_option('-M', '--mlist', help='File containing machines to %s %s ' 'the LABEL' % lower_words, type='string', metavar='MACHINE_FLIST') def parse(self): host_info = topic_common.item_parse_info(attribute_name='hosts', inline_option='machine', filename_option='mlist') (options, leftover) = super(label_add_or_remove, self).parse([host_info], req_items='labels') if not getattr(self, 'hosts', None): self.invalid_syntax('%s %s requires at least one host' % (self.msg_topic, self.usage_action)) return (options, leftover) class label_add(action_common.atest_add, label_add_or_remove): """atest label add <labels>|--blist <file> --platform [--machine <machine>] [--mlist <file>]""" pass class label_remove(action_common.atest_remove, label_add_or_remove): """atest label remove <labels>|--blist <file> [--machine <machine>] [--mlist <file>]""" pass