diff --git a/awx/main/models/inventory.py b/awx/main/models/inventory.py index 5ea55da1b5..e52bbc10a3 100644 --- a/awx/main/models/inventory.py +++ b/awx/main/models/inventory.py @@ -1017,7 +1017,7 @@ class InventorySourceOptions(BaseModel): if self.source != 'ec2': return '' invalid_filters = [] - instance_filter_re = re.compile(r'^(?:tag:.+)|(?:[a-z][a-z\.-]*[a-z])=.*$') + 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: @@ -1026,6 +1026,8 @@ class InventorySourceOptions(BaseModel): 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: diff --git a/awx/main/tests/inventory.py b/awx/main/tests/inventory.py index db6b7714ee..2583c95334 100644 --- a/awx/main/tests/inventory.py +++ b/awx/main/tests/inventory.py @@ -1306,10 +1306,26 @@ class InventoryUpdatesTest(BaseTransactionTest): response = self.put(inv_src_url1, inv_src_data, expect=400) # Invalid field name for instance filters. inv_src_data['instance_filters'] = 'foo=bar,' + with self.current_user(self.super_django_user): + response = self.put(inv_src_url1, inv_src_data, expect=400) + # Invalid tag expression for instance filters. + inv_src_data['instance_filters'] = 'tag:=,' + with self.current_user(self.super_django_user): + response = self.put(inv_src_url1, inv_src_data, expect=400) + # Another invalid tag expression for instance filters. + inv_src_data['instance_filters'] = 'tag:Name,' with self.current_user(self.super_django_user): response = self.put(inv_src_url1, inv_src_data, expect=400) # Valid string for instance filters. inv_src_data['instance_filters'] = 'tag-key=Name' + with self.current_user(self.super_django_user): + response = self.put(inv_src_url1, inv_src_data, expect=200) + # Another valid value for instance filters. + inv_src_data['instance_filters'] = 'tag:Name=test*' + with self.current_user(self.super_django_user): + response = self.put(inv_src_url1, inv_src_data, expect=200) + # Another valid instance filter with nothing after =. + inv_src_data['instance_filters'] = 'tag:Name=' with self.current_user(self.super_django_user): response = self.put(inv_src_url1, inv_src_data, expect=200) # Invalid string for group_by.