diff options
Diffstat (limited to 'openstack_dashboard/dashboards/project/loadbalancers/workflows.py')
-rw-r--r-- | openstack_dashboard/dashboards/project/loadbalancers/workflows.py | 609 |
1 files changed, 0 insertions, 609 deletions
diff --git a/openstack_dashboard/dashboards/project/loadbalancers/workflows.py b/openstack_dashboard/dashboards/project/loadbalancers/workflows.py deleted file mode 100644 index 69e7067b..00000000 --- a/openstack_dashboard/dashboards/project/loadbalancers/workflows.py +++ /dev/null @@ -1,609 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2013, Big Switch Networks, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -from django.utils.translation import ugettext_lazy as _ - -from horizon import exceptions -from horizon import forms -from horizon.utils import fields -from horizon.utils.validators import validate_port_range -from horizon import workflows - -from openstack_dashboard import api - - -LOG = logging.getLogger(__name__) - - -class AddPoolAction(workflows.Action): - name = forms.CharField(max_length=80, label=_("Name")) - description = forms.CharField( - initial="", required=False, - max_length=80, label=_("Description")) - subnet_id = forms.ChoiceField(label=_("Subnet")) - protocol = forms.ChoiceField(label=_("Protocol")) - lb_method = forms.ChoiceField(label=_("Load Balancing Method")) - admin_state_up = forms.BooleanField(label=_("Admin State"), - initial=True, required=False) - - def __init__(self, request, *args, **kwargs): - super(AddPoolAction, self).__init__(request, *args, **kwargs) - - tenant_id = request.user.tenant_id - - subnet_id_choices = [('', _("Select a Subnet"))] - try: - networks = api.neutron.network_list_for_tenant(request, tenant_id) - except: - exceptions.handle(request, - _('Unable to retrieve networks list.')) - networks = [] - for n in networks: - for s in n['subnets']: - subnet_id_choices.append((s.id, s.cidr)) - self.fields['subnet_id'].choices = subnet_id_choices - - protocol_choices = [('', _("Select a Protocol"))] - protocol_choices.append(('HTTP', 'HTTP')) - protocol_choices.append(('HTTPS', 'HTTPS')) - self.fields['protocol'].choices = protocol_choices - - lb_method_choices = [('', _("Select a Method"))] - lb_method_choices.append(('ROUND_ROBIN', 'ROUND_ROBIN')) - lb_method_choices.append(('LEAST_CONNECTIONS', 'LEAST_CONNECTIONS')) - lb_method_choices.append(('SOURCE_IP', 'SOURCE_IP')) - self.fields['lb_method'].choices = lb_method_choices - - class Meta: - name = _("Add New Pool") - permissions = ('openstack.services.network',) - help_text = _("Create Pool for current project.\n\n" - "Assign a name and description for the pool. " - "Choose one subnet where all members of this " - "pool must be on. " - "Select the protocol and load balancing method " - "for this pool. " - "Admin State is UP (checked) by default.") - - -class AddPoolStep(workflows.Step): - action_class = AddPoolAction - contributes = ("name", "description", "subnet_id", - "protocol", "lb_method", "admin_state_up") - - def contribute(self, data, context): - context = super(AddPoolStep, self).contribute(data, context) - if data: - return context - - -class AddPool(workflows.Workflow): - slug = "addpool" - name = _("Add Pool") - finalize_button_name = _("Add") - success_message = _('Added pool "%s".') - failure_message = _('Unable to add pool "%s".') - success_url = "horizon:project:loadbalancers:index" - default_steps = (AddPoolStep,) - - def format_status_message(self, message): - name = self.context.get('name') - return message % name - - def handle(self, request, context): - try: - api.lbaas.pool_create(request, **context) - return True - except: - return False - - -class AddVipAction(workflows.Action): - name = forms.CharField(max_length=80, label=_("Name")) - description = forms.CharField( - initial="", required=False, - max_length=80, label=_("Description")) - floatip_address = forms.ChoiceField( - label=_("VIP Address from Floating IPs"), - widget=forms.Select(attrs={'disabled': 'disabled'}), - required=False) - other_address = fields.IPField(required=False, - initial="", - version=fields.IPv4, - mask=False) - protocol_port = forms.IntegerField(label=_("Protocol Port"), min_value=1, - help_text=_("Enter an integer value " - "between 1 and 65535."), - validators=[validate_port_range]) - protocol = forms.ChoiceField(label=_("Protocol")) - session_persistence = forms.ChoiceField( - required=False, initial={}, label=_("Session Persistence")) - cookie_name = forms.CharField( - initial="", required=False, - max_length=80, label=_("Cookie Name"), - help_text=_("Required for APP_COOKIE persistence;" - " Ignored otherwise.")) - connection_limit = forms.IntegerField( - min_value=-1, label=_("Connection Limit"), - help_text=_("Maximum number of connections allowed " - "for the VIP or '-1' if the limit is not set")) - admin_state_up = forms.BooleanField( - label=_("Admin State"), initial=True, required=False) - - def __init__(self, request, *args, **kwargs): - super(AddVipAction, self).__init__(request, *args, **kwargs) - - self.fields['other_address'].label = _("Specify a free IP address" - " from %s" % - args[0]['subnet']) - - protocol_choices = [('', _("Select a Protocol"))] - protocol_choices.append(('HTTP', 'HTTP')) - protocol_choices.append(('HTTPS', 'HTTPS')) - self.fields['protocol'].choices = protocol_choices - - session_persistence_choices = [('', _("Set Session Persistence"))] - for mode in ('SOURCE_IP', 'HTTP_COOKIE', 'APP_COOKIE'): - session_persistence_choices.append((mode, mode)) - self.fields[ - 'session_persistence'].choices = session_persistence_choices - - floatip_address_choices = [('', _("Currently Not Supported"))] - self.fields['floatip_address'].choices = floatip_address_choices - - def clean(self): - cleaned_data = super(AddVipAction, self).clean() - if (cleaned_data.get('session_persistence') == 'APP_COOKIE' and - not cleaned_data.get('cookie_name')): - msg = _('Cookie name is required for APP_COOKIE persistence.') - self._errors['cookie_name'] = self.error_class([msg]) - return cleaned_data - - class Meta: - name = _("Specify VIP") - permissions = ('openstack.services.network',) - help_text = _("Create a VIP for this pool. " - "Assign a name and description for the VIP. " - "Specify an IP address and port for the VIP. " - "Choose the protocol and session persistence " - "method for the VIP." - "Specify the max connections allowed. " - "Admin State is UP (checked) by default.") - - -class AddVipStep(workflows.Step): - action_class = AddVipAction - depends_on = ("pool_id", "subnet") - contributes = ("name", "description", "floatip_address", - "other_address", "protocol_port", "protocol", - "session_persistence", "cookie_name", - "connection_limit", "admin_state_up") - - def contribute(self, data, context): - context = super(AddVipStep, self).contribute(data, context) - return context - - -class AddVip(workflows.Workflow): - slug = "addvip" - name = _("Add VIP") - finalize_button_name = _("Add") - success_message = _('Added VIP "%s".') - failure_message = _('Unable to add VIP "%s".') - success_url = "horizon:project:loadbalancers:index" - default_steps = (AddVipStep,) - - def format_status_message(self, message): - name = self.context.get('name') - return message % name - - def handle(self, request, context): - if context['other_address'] == '': - context['address'] = context['floatip_address'] - else: - if not context['floatip_address'] == '': - self.failure_message = _('Only one address can be specified. ' - 'Unable to add VIP "%s".') - return False - else: - context['address'] = context['other_address'] - try: - pool = api.lbaas.pool_get(request, context['pool_id']) - context['subnet_id'] = pool['subnet_id'] - except: - context['subnet_id'] = None - self.failure_message = _('Unable to retrieve the specified pool. ' - 'Unable to add VIP "%s".') - return False - - if context['session_persistence']: - stype = context['session_persistence'] - if stype == 'APP_COOKIE': - cookie = context['cookie_name'] - context['session_persistence'] = {'type': stype, - 'cookie_name': cookie} - else: - context['session_persistence'] = {'type': stype} - else: - context['session_persistence'] = {} - - try: - api.lbaas.vip_create(request, **context) - return True - except: - return False - - -class AddMemberAction(workflows.Action): - pool_id = forms.ChoiceField(label=_("Pool")) - members = forms.MultipleChoiceField( - label=_("Member(s)"), - required=True, - initial=["default"], - widget=forms.CheckboxSelectMultiple(), - error_messages={'required': - _('At least one member must be specified')}, - help_text=_("Select members for this pool ")) - weight = forms.IntegerField(max_value=256, min_value=0, label=_("Weight"), - help_text=_("Relative part of requests this " - "pool member serves compared to others")) - protocol_port = forms.IntegerField(label=_("Protocol Port"), min_value=1, - help_text=_("Enter an integer value " - "between 1 and 65535."), - validators=[validate_port_range]) - admin_state_up = forms.BooleanField(label=_("Admin State"), - initial=True, required=False) - - def __init__(self, request, *args, **kwargs): - super(AddMemberAction, self).__init__(request, *args, **kwargs) - - pool_id_choices = [('', _("Select a Pool"))] - try: - pools = api.lbaas.pools_get(request) - except: - pools = [] - exceptions.handle(request, - _('Unable to retrieve pools list.')) - pools = sorted(pools, - key=lambda pool: pool.name) - for p in pools: - pool_id_choices.append((p.id, p.name)) - self.fields['pool_id'].choices = pool_id_choices - - members_choices = [] - try: - servers, has_more = api.nova.server_list(request) - except: - servers = [] - exceptions.handle(request, - _('Unable to retrieve instances list.')) - - if len(servers) == 0: - self.fields['members'].label = _("No servers available. " - "Click Add to cancel.") - self.fields['members'].required = False - self.fields['members'].help_text = _("Select members " - "for this pool ") - self.fields['pool_id'].required = False - self.fields['weight'].required = False - self.fields['protocol_port'].required = False - return - - for m in servers: - members_choices.append((m.id, m.name)) - self.fields['members'].choices = sorted( - members_choices, - key=lambda member: member[1]) - - class Meta: - name = _("Add New Member") - permissions = ('openstack.services.network',) - help_text = _("Add member to selected pool.\n\n" - "Choose one or more listed instances to be " - "added to the pool as member(s). " - "Assign a numeric weight for this member " - "Specify the port number the member(s) " - "operate on; e.g., 80.") - - -class AddMemberStep(workflows.Step): - action_class = AddMemberAction - contributes = ("pool_id", "members", "protocol_port", "weight", - "admin_state_up") - - def contribute(self, data, context): - context = super(AddMemberStep, self).contribute(data, context) - return context - - -class AddMember(workflows.Workflow): - slug = "addmember" - name = _("Add Member") - finalize_button_name = _("Add") - success_message = _('Added member(s).') - failure_message = _('Unable to add member(s).') - success_url = "horizon:project:loadbalancers:index" - default_steps = (AddMemberStep,) - - def handle(self, request, context): - for m in context['members']: - params = {'device_id': m} - try: - plist = api.neutron.port_list(request, **params) - except: - return False - if plist: - context['address'] = plist[0].fixed_ips[0]['ip_address'] - try: - context['member_id'] = api.lbaas.member_create( - request, **context).id - except: - return False - return True - - -class AddMonitorAction(workflows.Action): - type = forms.ChoiceField( - label=_("Type"), - choices=[('ping', _('PING')), - ('tcp', _('TCP')), - ('http', _('HTTP')), - ('https', _('HTTPS'))], - widget=forms.Select(attrs={ - 'class': 'switchable', - 'data-slug': 'type' - })) - delay = forms.IntegerField( - min_value=1, - label=_("Delay"), - help_text=_("The minimum time in seconds between regular checks " - "of a member")) - timeout = forms.IntegerField( - min_value=1, - label=_("Timeout"), - help_text=_("The maximum time in seconds for a monitor to wait " - "for a reply")) - max_retries = forms.IntegerField( - max_value=10, min_value=1, - label=_("Max Retries (1~10)"), - help_text=_("Number of permissible failures before changing " - "the status of member to inactive")) - http_method = forms.ChoiceField( - initial="GET", - required=False, - choices=[('GET', _('GET'))], - label=_("HTTP Method"), - help_text=_("HTTP method used to check health status of a member"), - widget=forms.Select(attrs={ - 'class': 'switched', - 'data-switch-on': 'type', - 'data-type-http': _('HTTP Method'), - 'data-type-https': _('HTTP Method') - })) - url_path = forms.CharField( - initial="/", - required=False, - max_length=80, - label=_("URL"), - widget=forms.TextInput(attrs={ - 'class': 'switched', - 'data-switch-on': 'type', - 'data-type-http': _('URL'), - 'data-type-https': _('URL') - })) - expected_codes = forms.RegexField( - initial="200", - required=False, - max_length=80, - regex=r'^(\d{3}(\s*,\s*\d{3})*)$|^(\d{3}-\d{3})$', - label=_("Expected HTTP Status Codes"), - help_text=_("Expected code may be a single value (e.g. 200), " - "a list of values (e.g. 200, 202), " - "or range of values (e.g. 200-204)"), - widget=forms.TextInput(attrs={ - 'class': 'switched', - 'data-switch-on': 'type', - 'data-type-http': _('Expected HTTP Status Codes'), - 'data-type-https': _('Expected HTTP Status Codes') - })) - admin_state_up = forms.BooleanField(label=_("Admin State"), - initial=True, required=False) - - def __init__(self, request, *args, **kwargs): - super(AddMonitorAction, self).__init__(request, *args, **kwargs) - - def clean(self): - cleaned_data = super(AddMonitorAction, self).clean() - type_opt = cleaned_data.get('type') - - if type_opt in ['http', 'https']: - http_method_opt = cleaned_data.get('http_method') - url_path = cleaned_data.get('url_path') - expected_codes = cleaned_data.get('expected_codes') - - if not http_method_opt: - msg = _('Please choose a HTTP method') - self._errors['http_method'] = self.error_class([msg]) - if not url_path: - msg = _('Please specify an URL') - self._errors['url_path'] = self.error_class([msg]) - if not expected_codes: - msg = _('Please enter a single value (e.g. 200), ' - 'a list of values (e.g. 200, 202), ' - 'or range of values (e.g. 200-204)') - self._errors['expected_codes'] = self.error_class([msg]) - return cleaned_data - - class Meta: - name = _("Add New Monitor") - permissions = ('openstack.services.network',) - help_text = _("Create a monitor template.\n\n" - "Select type of monitoring. " - "Specify delay, timeout, and retry limits " - "required by the monitor. " - "Specify method, URL path, and expected " - "HTTP codes upon success.") - - -class AddMonitorStep(workflows.Step): - action_class = AddMonitorAction - contributes = ("type", "delay", "timeout", "max_retries", - "http_method", "url_path", "expected_codes", - "admin_state_up") - - def contribute(self, data, context): - context = super(AddMonitorStep, self).contribute(data, context) - if data: - return context - - -class AddMonitor(workflows.Workflow): - slug = "addmonitor" - name = _("Add Monitor") - finalize_button_name = _("Add") - success_message = _('Added monitor') - failure_message = _('Unable to add monitor') - success_url = "horizon:project:loadbalancers:index" - default_steps = (AddMonitorStep,) - - def handle(self, request, context): - try: - context['monitor_id'] = api.lbaas.pool_health_monitor_create( - request, **context).get('id') - return True - except: - exceptions.handle(request, _("Unable to add monitor.")) - return False - - -class AddPMAssociationAction(workflows.Action): - monitor_id = forms.ChoiceField(label=_("Monitor")) - - def __init__(self, request, *args, **kwargs): - super(AddPMAssociationAction, self).__init__(request, *args, **kwargs) - - def populate_monitor_id_choices(self, request, context): - self.fields['monitor_id'].label = _("Select a monitor template " - "for %s" % context['pool_name']) - - monitor_id_choices = [('', _("Select a Monitor"))] - try: - monitors = api.lbaas.pool_health_monitors_get(request) - for m in monitors: - if m.id not in context['pool_monitors']: - monitor_id_choices.append((m.id, m.id)) - except: - exceptions.handle(request, - _('Unable to retrieve monitors list.')) - self.fields['monitor_id'].choices = monitor_id_choices - - return monitor_id_choices - - class Meta: - name = _("Association Details") - permissions = ('openstack.services.network',) - help_text = _("Associate a health monitor with target pool.") - - -class AddPMAssociationStep(workflows.Step): - action_class = AddPMAssociationAction - depends_on = ("pool_id", "pool_name", "pool_monitors") - contributes = ("monitor_id",) - - def contribute(self, data, context): - context = super(AddPMAssociationStep, self).contribute(data, context) - if data: - return context - - -class AddPMAssociation(workflows.Workflow): - slug = "addassociation" - name = _("Add Association") - finalize_button_name = _("Add") - success_message = _('Added association.') - failure_message = _('Unable to add association.') - success_url = "horizon:project:loadbalancers:index" - default_steps = (AddPMAssociationStep,) - - def handle(self, request, context): - try: - context['monitor_id'] = api.lbaas.pool_monitor_association_create( - request, **context) - return True - except: - exceptions.handle(request, _("Unable to add association.")) - return False - - -class DeletePMAssociationAction(workflows.Action): - monitor_id = forms.ChoiceField(label=_("Monitor")) - - def __init__(self, request, *args, **kwargs): - super(DeletePMAssociationAction, self).__init__( - request, *args, **kwargs) - - def populate_monitor_id_choices(self, request, context): - self.fields['monitor_id'].label = _("Select a health monitor of %s" % - context['pool_name']) - - monitor_id_choices = [('', _("Select a Monitor"))] - try: - for m_id in context['pool_monitors']: - monitor_id_choices.append((m_id, m_id)) - except: - exceptions.handle(request, - _('Unable to retrieve monitors list.')) - self.fields['monitor_id'].choices = monitor_id_choices - - return monitor_id_choices - - class Meta: - name = _("Association Details") - permissions = ('openstack.services.network',) - help_text = _("Disassociate a health monitor from target pool. ") - - -class DeletePMAssociationStep(workflows.Step): - action_class = DeletePMAssociationAction - depends_on = ("pool_id", "pool_name", "pool_monitors") - contributes = ("monitor_id",) - - def contribute(self, data, context): - context = super(DeletePMAssociationStep, self).contribute( - data, context) - if data: - return context - - -class DeletePMAssociation(workflows.Workflow): - slug = "deleteassociation" - name = _("Delete Association") - finalize_button_name = _("Delete") - success_message = _('Deleted association.') - failure_message = _('Unable to delete association.') - success_url = "horizon:project:loadbalancers:index" - default_steps = (DeletePMAssociationStep,) - - def handle(self, request, context): - try: - context['monitor_id'] = api.lbaas.pool_monitor_association_delete( - request, **context) - return True - except: - exceptions.handle(request, _("Unable to delete association.")) - return False |