mirror of
https://github.com/ansible/awx.git
synced 2026-05-03 23:55:28 -02:30
Update validation for instance filters to allow 'tag:key=value'. Fixes https://trello.com/c/VH9Vnd8z.
This commit is contained in:
@@ -1017,7 +1017,7 @@ class InventorySourceOptions(BaseModel):
|
|||||||
if self.source != 'ec2':
|
if self.source != 'ec2':
|
||||||
return ''
|
return ''
|
||||||
invalid_filters = []
|
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(','):
|
for instance_filter in instance_filters.split(','):
|
||||||
instance_filter = instance_filter.strip()
|
instance_filter = instance_filter.strip()
|
||||||
if not instance_filter:
|
if not instance_filter:
|
||||||
@@ -1026,6 +1026,8 @@ class InventorySourceOptions(BaseModel):
|
|||||||
invalid_filters.append(instance_filter)
|
invalid_filters.append(instance_filter)
|
||||||
continue
|
continue
|
||||||
instance_filter_name = instance_filter.split('=', 1)[0]
|
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:
|
if instance_filter_name not in self.INSTANCE_FILTER_NAMES:
|
||||||
invalid_filters.append(instance_filter)
|
invalid_filters.append(instance_filter)
|
||||||
if invalid_filters:
|
if invalid_filters:
|
||||||
|
|||||||
@@ -1306,10 +1306,26 @@ class InventoryUpdatesTest(BaseTransactionTest):
|
|||||||
response = self.put(inv_src_url1, inv_src_data, expect=400)
|
response = self.put(inv_src_url1, inv_src_data, expect=400)
|
||||||
# Invalid field name for instance filters.
|
# Invalid field name for instance filters.
|
||||||
inv_src_data['instance_filters'] = 'foo=bar,'
|
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):
|
with self.current_user(self.super_django_user):
|
||||||
response = self.put(inv_src_url1, inv_src_data, expect=400)
|
response = self.put(inv_src_url1, inv_src_data, expect=400)
|
||||||
# Valid string for instance filters.
|
# Valid string for instance filters.
|
||||||
inv_src_data['instance_filters'] = 'tag-key=Name'
|
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):
|
with self.current_user(self.super_django_user):
|
||||||
response = self.put(inv_src_url1, inv_src_data, expect=200)
|
response = self.put(inv_src_url1, inv_src_data, expect=200)
|
||||||
# Invalid string for group_by.
|
# Invalid string for group_by.
|
||||||
|
|||||||
Reference in New Issue
Block a user