Source code for openstack_dashboard.dashboards.project.loadbalancers.tables

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


from django.core.urlresolvers import reverse
from django import shortcuts
from django import template
from django.template import defaultfilters as filters
from django.utils import http
from django.utils.http import urlencode
from django.utils.translation import pgettext_lazy
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext_lazy

from horizon import conf
from horizon import exceptions
from horizon import messages
from horizon import tables

from openstack_dashboard import api
from openstack_dashboard.dashboards.project.access_and_security.floating_ips \
    import workflows
from openstack_dashboard import policy
















[docs]class AddVIPFloatingIP(policy.PolicyTargetMixin, tables.LinkAction): """Add floating ip to VIP This class is extremely similar to AssociateIP from the instances page """ name = "associate" verbose_name = _("Associate Floating IP") url = "horizon:project:access_and_security:floating_ips:associate" classes = ("ajax-modal",) icon = "link" policy_rules = (("compute", "network:associate_floating_ip"),)
[docs] def allowed(self, request, pool): if not api.network.floating_ip_supported(request): return False if api.network.floating_ip_simple_associate_supported(request): return False if hasattr(pool, "vip") and pool.vip: vip = pool.vip return not (hasattr(vip, "fip") and vip.fip) return False
[docs]class RemoveVIPFloatingIP(policy.PolicyTargetMixin, tables.Action): """Remove floating IP from VIP This class is extremely similar to the project instance table SimpleDisassociateIP feature, but just different enough to not be able to share much code """ name = "disassociate" preempt = True icon = "unlink" verbose_name = _("Disassociate Floating IP") classes = ("btn-danger", "btn-disassociate",) policy_rules = (("compute", "network:disassociate_floating_ip"),)
[docs] def allowed(self, request, pool): if not api.network.floating_ip_supported(request): return False if not conf.HORIZON_CONFIG["simple_ip_management"]: return False if hasattr(pool, "vip") and pool.vip: vip = pool.vip self.help_text = _('Floating IP will be removed ' 'from VIP "%s".') % vip.name return hasattr(vip, "fip") and vip.fip return False
[docs] def single(self, table, request, pool_id): try: pool = api.lbaas.pool_get(request, pool_id) fips = api.network.tenant_floating_ip_list(request) vip_fips = [fip for fip in fips if fip.port_id == pool.vip.port_id] if not vip_fips: messages.info(request, _("No floating IPs to disassociate.")) else: api.network.floating_ip_disassociate(request, vip_fips[0].id) messages.success(request, _("Successfully disassociated " "floating IP: %s") % vip_fips[0].ip) except Exception: exceptions.handle(request, _("Unable to disassociate floating IP.")) return shortcuts.redirect(request.get_full_path())
[docs]class UpdatePoolsRow(tables.Row): ajax = True
[docs] def get_data(self, request, pool_id): pool = api.lbaas.pool_get(request, pool_id) try: vip = api.lbaas.vip_get(request, pool.vip_id) pool.vip = vip except Exception: pass try: subnet = api.neutron.subnet_get(request, pool.subnet_id) pool.subnet_name = subnet.cidr except Exception: pool.subnet_name = pool.subnet_id return pool
STATUS_CHOICES = ( ("Active", True), ("Down", True), ("Error", False), ) STATUS_DISPLAY_CHOICES = ( ("Active", pgettext_lazy("Current status of a Pool", u"Active")), ("Down", pgettext_lazy("Current status of a Pool", u"Down")), ("Error", pgettext_lazy("Current status of a Pool", u"Error")), ("Created", pgettext_lazy("Current status of a Pool", u"Created")), ("Pending_Create", pgettext_lazy("Current status of a Pool", u"Pending Create")), ("Pending_Update", pgettext_lazy("Current status of a Pool", u"Pending Update")), ("Pending_Delete", pgettext_lazy("Current status of a Pool", u"Pending Delete")), ("Inactive", pgettext_lazy("Current status of a Pool", u"Inactive")), ) ADMIN_STATE_DISPLAY_CHOICES = ( ("UP", pgettext_lazy("Admin state of a Load balancer", u"UP")), ("DOWN", pgettext_lazy("Admin state of a Load balancer", u"DOWN")), )
[docs]def get_vip_name(pool): if hasattr(pool, "vip") and pool.vip: template_name = 'project/loadbalancers/_pool_table_vip_cell.html' context = {"vip": pool.vip, } return template.loader.render_to_string(template_name, context) else: return None
[docs]def get_subnet(pool): if hasattr(pool, "subnet") and pool.subnet: template_name = 'project/loadbalancers/_pool_table_subnet_cell.html' context = {"subnet": pool.subnet} return template.loader.render_to_string(template_name, context) else: return None
[docs]class PoolsTable(tables.DataTable): METHOD_DISPLAY_CHOICES = ( ("round_robin", pgettext_lazy("load balancing method", u"Round Robin")), ("least_connections", pgettext_lazy("load balancing method", u"Least Connections")), ("source_ip", pgettext_lazy("load balancing method", u"Source IP")), ) name = tables.Column("name_or_id", verbose_name=_("Name"), link="horizon:project:loadbalancers:pooldetails") description = tables.Column('description', verbose_name=_("Description")) provider = tables.Column('provider', verbose_name=_("Provider"), filters=(lambda v: filters.default(v, _('N/A')),)) subnet_name = tables.Column(get_subnet, verbose_name=_("Subnet")) protocol = tables.Column('protocol', verbose_name=_("Protocol")) method = tables.Column('lb_method', verbose_name=_("LB Method"), display_choices=METHOD_DISPLAY_CHOICES) status = tables.Column('status', verbose_name=_("Status"), status=True, status_choices=STATUS_CHOICES, display_choices=STATUS_DISPLAY_CHOICES) vip_name = tables.Column(get_vip_name, verbose_name=_("VIP")) admin_state = tables.Column("admin_state", verbose_name=_("Admin State"), display_choices=ADMIN_STATE_DISPLAY_CHOICES)
[docs] class Meta(object): name = "poolstable" verbose_name = _("Pools") status_columns = ["status"] row_class = UpdatePoolsRow table_actions = (AddPoolLink, DeletePoolLink) row_actions = (UpdatePoolLink, AddVipLink, UpdateVipLink, DeleteVipLink, AddPMAssociationLink, DeletePMAssociationLink, DeletePoolLink, AddVIPFloatingIP, RemoveVIPFloatingIP)
[docs]class UpdateMemberRow(tables.Row): ajax = True
[docs] def get_data(self, request, member_id): member = api.lbaas.member_get(request, member_id) try: pool = api.lbaas.pool_get(request, member.pool_id) member.pool_name = pool.name except Exception: member.pool_name = member.pool_id return member
[docs]class MembersTable(tables.DataTable): address = tables.Column('address', verbose_name=_("IP Address"), link=get_member_link, attrs={'data-type': "ip"}) protocol_port = tables.Column('protocol_port', verbose_name=_("Protocol Port")) weight = tables.Column('weight', verbose_name=_("Weight")) pool_name = tables.Column('pool_name', verbose_name=_("Pool"), link=get_pool_link) status = tables.Column('status', verbose_name=_("Status"), status=True, status_choices=STATUS_CHOICES, display_choices=STATUS_DISPLAY_CHOICES) admin_state = tables.Column("admin_state", verbose_name=_("Admin State"), display_choices=ADMIN_STATE_DISPLAY_CHOICES)
[docs] class Meta(object): name = "memberstable" verbose_name = _("Members") status_columns = ["status"] row_class = UpdateMemberRow table_actions = (AddMemberLink, DeleteMemberLink) row_actions = (UpdateMemberLink, DeleteMemberLink)
[docs]def get_monitor_details(monitor): if monitor.type in ('HTTP', 'HTTPS'): return ("%(http_method)s %(url_path)s => %(codes)s" % {'http_method': monitor.http_method, 'url_path': monitor.url_path, 'codes': monitor.expected_codes}) else: return _("-")
[docs]class MonitorsTable(tables.DataTable): monitor_type = tables.Column( "type", verbose_name=_("Monitor Type"), link="horizon:project:loadbalancers:monitordetails") delay = tables.Column("delay", verbose_name=_("Delay")) timeout = tables.Column("timeout", verbose_name=_("Timeout")) max_retries = tables.Column("max_retries", verbose_name=_("Max Retries")) details = tables.Column(get_monitor_details, verbose_name=_("Details")) admin_state = tables.Column("admin_state", verbose_name=_("Admin State"), display_choices=ADMIN_STATE_DISPLAY_CHOICES)
[docs] class Meta(object): name = "monitorstable" verbose_name = _("Monitors") table_actions = (AddMonitorLink, DeleteMonitorLink) row_actions = (UpdateMonitorLink, DeleteMonitorLink)

Project Source