Merge "Classifier to support custom IP protocol numbers"

This commit is contained in:
Jenkins 2015-12-11 18:50:08 +00:00 committed by Gerrit Code Review
commit 5d0c13b845
2 changed files with 36 additions and 20 deletions

View File

@ -12,7 +12,9 @@
from django.core import urlresolvers from django.core import urlresolvers
from django.forms import fields from django.forms import fields
from django.forms import TextInput
from django.forms import widgets from django.forms import widgets
from django.utils.safestring import mark_safe
class DynamicMultiSelectWidget(widgets.SelectMultiple): class DynamicMultiSelectWidget(widgets.SelectMultiple):
@ -65,3 +67,20 @@ class DynamicMultiChoiceField(fields.MultipleChoiceField):
class CustomMultiChoiceField(DynamicMultiChoiceField): class CustomMultiChoiceField(DynamicMultiChoiceField):
def validate(self, *args, **kwargs): def validate(self, *args, **kwargs):
return True return True
class DropdownEditWidget(TextInput):
def __init__(self, data_list, name, *args, **kwargs):
super(DropdownEditWidget, self).__init__(*args, **kwargs)
self._name = name
self._list = data_list
self.attrs.update({'list': 'list__%s' % self._name})
def render(self, name, value, attrs=None):
text_html = super(DropdownEditWidget, self).render(
name, value, attrs=attrs)
data_list = '<datalist id="list__%s">' % self._name
for item in self._list:
data_list += '<option value="%s">' % item
data_list += '</datalist>'
return mark_safe(text_html + data_list)

View File

@ -23,17 +23,10 @@ from horizon import messages
from gbpui import client from gbpui import client
from gbpui import column_filters as gfilters from gbpui import column_filters as gfilters
from gbpui import fields
PROTOCOLS = [('tcp', _('TCP')), PROTOCOLS = ('TCP', 'UDP', 'ICMP', 'HTTP',
('udp', _('UDP')), 'HTTPS', 'SMTP', 'DNS', 'FTP', 'ANY')
('icmp', _('ICMP')),
('http', _('HTTP')),
('https', _('HTTPS')),
('smtp', _('SMTP')),
('dns', _('DNS')),
('ftp', _('FTP')),
('any', _('ANY'))
]
DIRECTIONS = [('in', _('IN')), DIRECTIONS = [('in', _('IN')),
('out', _('OUT')), ('out', _('OUT')),
('bi', _('BI'))] ('bi', _('BI'))]
@ -195,9 +188,7 @@ class UpdatePolicyActionForm(BaseUpdateForm):
class AddPolicyClassifierForm(forms.SelfHandlingForm): class AddPolicyClassifierForm(forms.SelfHandlingForm):
name = forms.CharField(max_length=80, label=_("Name"), required=False) name = forms.CharField(max_length=80, label=_("Name"), required=False)
protocol = forms.ChoiceField(label=_("Protocol"), choices=PROTOCOLS, protocol = forms.CharField(required=True)
widget=forms.Select(attrs={'class': 'switchable',
'data-slug': 'source'}))
port_range = forms.CharField(max_length=80, label=_("Port/Range(min:max)"), port_range = forms.CharField(max_length=80, label=_("Port/Range(min:max)"),
required=False, required=False,
widget=forms.TextInput(attrs={'class': 'switched', widget=forms.TextInput(attrs={'class': 'switched',
@ -219,13 +210,16 @@ class AddPolicyClassifierForm(forms.SelfHandlingForm):
def __init__(self, request, *args, **kwargs): def __init__(self, request, *args, **kwargs):
super(AddPolicyClassifierForm, self).__init__(request, *args, **kwargs) super(AddPolicyClassifierForm, self).__init__(request, *args, **kwargs)
self.fields['protocol'].widget = fields.DropdownEditWidget(
data_list=PROTOCOLS, name='list')
def handle(self, request, context): def handle(self, request, context):
url = reverse('horizon:project:application_policy:index') url = reverse('horizon:project:application_policy:index')
try: try:
if context.get('protocol') in PROTOCOL_MAP: protocol = context.get('protocol').lower()
context['protocol'] = PROTOCOL_MAP[context['protocol']] if protocol in PROTOCOL_MAP:
elif context.get('protocol') == "any": context['protocol'] = PROTOCOL_MAP[protocol]
elif protocol == "any":
del context['protocol'] del context['protocol']
if not context.get('port_range'): if not context.get('port_range'):
context['port_range'] = None context['port_range'] = None
@ -244,7 +238,7 @@ class AddPolicyClassifierForm(forms.SelfHandlingForm):
class UpdatePolicyClassifierForm(BaseUpdateForm): class UpdatePolicyClassifierForm(BaseUpdateForm):
name = forms.CharField(max_length=80, label=_("Name"), required=False) name = forms.CharField(max_length=80, label=_("Name"), required=False)
description = forms.CharField(label=_("Description"), required=False) description = forms.CharField(label=_("Description"), required=False)
protocol = forms.ChoiceField(label=_("Protocol"), choices=PROTOCOLS) protocol = forms.CharField(required=True)
port_range = forms.CharField(max_length=80, label=_("Port/Range(min:max)"), port_range = forms.CharField(max_length=80, label=_("Port/Range(min:max)"),
required=False) required=False)
direction = forms.ChoiceField(label=_("Direction"), choices=DIRECTIONS) direction = forms.ChoiceField(label=_("Direction"), choices=DIRECTIONS)
@ -253,6 +247,8 @@ class UpdatePolicyClassifierForm(BaseUpdateForm):
def __init__(self, request, *args, **kwargs): def __init__(self, request, *args, **kwargs):
super(UpdatePolicyClassifierForm, self).__init__( super(UpdatePolicyClassifierForm, self).__init__(
request, *args, **kwargs) request, *args, **kwargs)
self.fields['protocol'].widget = fields.DropdownEditWidget(
data_list=PROTOCOLS, name='list')
try: try:
policyclassifier_id = self.initial['policyclassifier_id'] policyclassifier_id = self.initial['policyclassifier_id']
classifier = client.policyclassifier_get( classifier = client.policyclassifier_get(
@ -274,9 +270,10 @@ class UpdatePolicyClassifierForm(BaseUpdateForm):
url = reverse('horizon:project:application_policy:index') url = reverse('horizon:project:application_policy:index')
try: try:
policyclassifier_id = self.initial['policyclassifier_id'] policyclassifier_id = self.initial['policyclassifier_id']
if context.get('protocol') in PROTOCOL_MAP: protocol = context.get('protocol').lower()
context['protocol'] = PROTOCOL_MAP[context['protocol']] if protocol in PROTOCOL_MAP:
elif context.get('protocol') == "any": context['protocol'] = PROTOCOL_MAP[protocol]
elif protocol == "any":
context['protocol'] = None context['protocol'] = None
if 'port_range' in context and context['port_range'] == '': if 'port_range' in context and context['port_range'] == '':
context['port_range'] = None context['port_range'] = None