Update validation for instance filters to allow 'tag:key=value'. Fixes https://trello.com/c/VH9Vnd8z.

This commit is contained in:
Chris Church 2014-12-17 02:31:33 -05:00
parent ee97e83b2c
commit 844e1b7343
2 changed files with 19 additions and 1 deletions

View File

@ -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:

View File

@ -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.