Source code for horizon.dashboards.nova.access_and_security.floating_ips.workflows

# vim: tabstop=4 shiftwidth=4 softtabstop=4

# Copyright 2012 Nebula, 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.utils.translation import ugettext_lazy as _

from horizon import api
from horizon import exceptions
from horizon import workflows
from horizon import forms


ALLOCATE_URL = "horizon:nova:access_and_security:floating_ips:allocate"


class AssociateIPAction(workflows.Action):
[docs] ip_id = forms.DynamicTypedChoiceField(label=_("IP Address"), coerce=int, empty_value=None, add_item_link=ALLOCATE_URL) instance_id = forms.ChoiceField(label=_("Instance")) class Meta: name = _("IP Address") help_text = _("Select the IP address you wish to associate with " "the selected instance.") def populate_ip_id_choices(self, request, context):
[docs] try: ips = api.nova.tenant_floating_ip_list(self.request) except: redirect = reverse('horizon:nova:access_and_security:index') exceptions.handle(self.request, _('Unable to retrieve floating IP addresses.'), redirect=redirect) options = sorted([(ip.id, ip.ip) for ip in ips if not ip.instance_id]) if options: options.insert(0, ("", _("Select an IP address"))) else: options = [("", _("No IP addresses available"))] return options def populate_instance_id_choices(self, request, context):
[docs] try: servers = api.nova.server_list(self.request) except: redirect = reverse('horizon:nova:access_and_security:index') exceptions.handle(self.request, _('Unable to retrieve instance list.'), redirect=redirect) instances = [] for server in servers: server_name = "%s (%s)" % (server.name, server.id) instances.append((server.id, server_name)) # Sort instances for easy browsing instances = sorted(instances, key=lambda x: x[1]) if instances: instances.insert(0, ("", _("Select an instance"))) else: instances = (("", _("No instances available")),) return instances class AssociateIP(workflows.Step):
[docs] action_class = AssociateIPAction contributes = ("ip_id", "instance_id", "ip_address") def contribute(self, data, context):
[docs] context = super(AssociateIP, self).contribute(data, context) ip_id = data.get('ip_id', None) if ip_id: ip_choices = dict(self.action.fields['ip_id'].choices) context["ip_address"] = ip_choices.get(ip_id, None) return context class IPAssociationWorkflow(workflows.Workflow):
[docs] slug = "ip_association" name = _("Manage Floating IP Associations") finalize_button_name = _("Associate") success_message = _('IP address %s associated.') failure_message = _('Unable to associate IP address %s.') success_url = "horizon:nova:access_and_security:index" default_steps = (AssociateIP,) def format_status_message(self, message):
[docs] return message % self.context.get('ip_address', 'unknown IP address') def handle(self, request, data):
[docs] try: api.nova.server_add_floating_ip(request, data['instance_id'], data['ip_id']) except: exceptions.handle(request) return False return True