From 8b97db06b0b87a4f3b016c9dc2309e8df9b032b2 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 30 May 2017 16:38:09 -0400 Subject: [PATCH] abuse group_by and instance_filters --- awx/main/models/inventory.py | 72 +++++++++++++++++++----------------- awx/main/tasks.py | 2 +- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/awx/main/models/inventory.py b/awx/main/models/inventory.py index a41b166e94..656358786a 100644 --- a/awx/main/models/inventory.py +++ b/awx/main/models/inventory.py @@ -1093,44 +1093,50 @@ class InventorySourceOptions(BaseModel): def clean_instance_filters(self): instance_filters = unicode(self.instance_filters or '') - if self.source != 'ec2': + if self.source == 'ec2': + invalid_filters = [] + instance_filter_re = re.compile(r'^((tag:.+)|([a-z][a-z\.-]*[a-z]))=.*$') + for instance_filter in instance_filters.split(','): + instance_filter = instance_filter.strip() + if not instance_filter: + continue + if not instance_filter_re.match(instance_filter): + invalid_filters.append(instance_filter) + continue + instance_filter_name = instance_filter.split('=', 1)[0] + if instance_filter_name.startswith('tag:'): + continue + if instance_filter_name not in self.INSTANCE_FILTER_NAMES: + invalid_filters.append(instance_filter) + if invalid_filters: + raise ValidationError(_('Invalid filter expression: %(filter)s') % + {'filter': ', '.join(invalid_filters)}) + return instance_filters + elif self.source == 'vmware': + return instance_filters + else: return '' - invalid_filters = [] - instance_filter_re = re.compile(r'^((tag:.+)|([a-z][a-z\.-]*[a-z]))=.*$') - for instance_filter in instance_filters.split(','): - instance_filter = instance_filter.strip() - if not instance_filter: - continue - if not instance_filter_re.match(instance_filter): - invalid_filters.append(instance_filter) - continue - instance_filter_name = instance_filter.split('=', 1)[0] - if instance_filter_name.startswith('tag:'): - continue - if instance_filter_name not in self.INSTANCE_FILTER_NAMES: - invalid_filters.append(instance_filter) - if invalid_filters: - raise ValidationError(_('Invalid filter expression: %(filter)s') % - {'filter': ', '.join(invalid_filters)}) - return instance_filters def clean_group_by(self): group_by = unicode(self.group_by or '') - if self.source != 'ec2': + if self.source == 'ec2': + get_choices = getattr(self, 'get_%s_group_by_choices' % self.source) + valid_choices = [x[0] for x in get_choices()] + choice_transform = lambda x: x.strip().lower() + valid_choices = [choice_transform(x) for x in valid_choices] + choices = [choice_transform(x) for x in group_by.split(',') if x.strip()] + invalid_choices = [] + for c in choices: + if c not in valid_choices and c not in invalid_choices: + invalid_choices.append(c) + if invalid_choices: + raise ValidationError(_('Invalid group by choice: %(choice)s') % + {'choice': ', '.join(invalid_choices)}) + return ','.join(choices) + elif self.source == 'vmware': + return group_by + else: return '' - get_choices = getattr(self, 'get_%s_group_by_choices' % self.source) - valid_choices = [x[0] for x in get_choices()] - choice_transform = lambda x: x.strip().lower() - valid_choices = [choice_transform(x) for x in valid_choices] - choices = [choice_transform(x) for x in group_by.split(',') if x.strip()] - invalid_choices = [] - for c in choices: - if c not in valid_choices and c not in invalid_choices: - invalid_choices.append(c) - if invalid_choices: - raise ValidationError(_('Invalid group by choice: %(choice)s') % - {'choice': ', '.join(invalid_choices)}) - return ','.join(choices) class InventorySource(UnifiedJobTemplate, InventorySourceOptions): diff --git a/awx/main/tasks.py b/awx/main/tasks.py index 0cb7c5a9c6..57ac4f3ede 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -1597,7 +1597,7 @@ class RunInventoryUpdate(BaseTask): if inventory_update.instance_filters: vmware_opts.setdefault('host_filters', inventory_update.instance_filters) if inventory_update.group_by: - vmware_opts.setdefault('groupby_patterns', inventory_update.groupby_patterns) + vmware_opts.setdefault('groupby_patterns', inventory_update.group_by) for k,v in vmware_opts.items(): cp.set(section, k, unicode(v))