207 lines
7.4 KiB
Python

# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2011 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Copyright 2011 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.
"""
Views for managing api.quantum_api(request) network ports.
"""
import logging
from django import http
from django import shortcuts
from django import template
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from django_openstack import forms
from django_openstack import api
LOG = logging.getLogger('django_openstack.dash.views.ports')
class CreatePort(forms.SelfHandlingForm):
network = forms.CharField(widget=forms.HiddenInput())
ports_num = forms.IntegerField(required=True, label=_("Number of Ports"))
def handle(self, request, data):
try:
LOG.info('Creating %s ports on network %s' %
(data['ports_num'], data['network']))
for i in range(0, data['ports_num']):
api.quantum_create_port(request, data['network'])
except Exception, e:
messages.error(request,
_('Unable to create ports on network %(network)s: %(msg)s') %
{"network": data['network'], "msg": e.message})
else:
msg = _('%(num_ports)s ports created on network %(network)s.') % {
"num_ports": data['ports_num'], "network": data['network']}
LOG.info(msg)
messages.success(request, msg)
return shortcuts.redirect(request.build_absolute_uri())
class DeletePort(forms.SelfHandlingForm):
network = forms.CharField(widget=forms.HiddenInput())
port = forms.CharField(widget=forms.HiddenInput())
def handle(self, request, data):
try:
LOG.info('Deleting %s ports on network %s' %
(data['port'], data['network']))
api.quantum_delete_port(request, data['network'], data['port'])
except Exception, e:
messages.error(request,
_('Unable to delete port %(port)s: %(msg)s') %
{"port": data['port'], "msg": e.message})
else:
msg = _('Port %(port)s deleted from network %(network)s.') % {
"port": data['port'], "network": data['network']}
LOG.info(msg)
messages.success(request, msg)
return shortcuts.redirect(request.build_absolute_uri())
class AttachPort(forms.SelfHandlingForm):
network = forms.CharField(widget=forms.HiddenInput())
port = forms.CharField(widget=forms.HiddenInput())
vif_id = forms.CharField(widget=forms.Select(),
label=_("Select VIF to connect"))
def handle(self, request, data):
try:
LOG.info('Attaching %s port to VIF %s' %
(data['port'], data['vif_id']))
body = {'attachment': {'id': '%s' % data['vif_id']}}
api.quantum_attach_port(request,
data['network'], data['port'], body)
except Exception, e:
messages.error(request,
_('Unable to attach port %(port)s to VIF %(vif)s: %(msg)s') %
{"port": data['port'], "vif": data['vif_id'], "msg": e.message})
else:
msg = _('Port %(port)s connected to VIF %(vif)s.') % \
{"port": data['port'], "vif": data['vif_id']}
LOG.info(msg)
messages.success(request, msg)
return shortcuts.redirect(request.build_absolute_uri())
class DetachPort(forms.SelfHandlingForm):
network = forms.CharField(widget=forms.HiddenInput())
port = forms.CharField(widget=forms.HiddenInput())
def handle(self, request, data):
try:
LOG.info('Detaching port %s' % data['port'])
api.quantum_detach_port(request, data['network'], data['port'])
except Exception, e:
messages.error(request,
_('Unable to detach port %(port)s: %(message)s') %
{"port": data['port'], "message": e.message})
else:
msg = _('Port %s detached.') % (data['port'])
LOG.info(msg)
messages.success(request, msg)
return shortcuts.redirect(request.build_absolute_uri())
class TogglePort(forms.SelfHandlingForm):
network = forms.CharField(widget=forms.HiddenInput())
port = forms.CharField(widget=forms.HiddenInput())
state = forms.CharField(widget=forms.HiddenInput())
def handle(self, request, data):
try:
LOG.info('Toggling port state to %s' % data['state'])
body = {'port': {'state': '%s' % data['state']}}
api.quantum_set_port_state(request,
data['network'], data['port'], body)
except Exception, e:
messages.error(request,
_('Unable to set port state to %(state)s: %(message)s') %
{"state": data['state'], "message": e.message})
else:
msg = _('Port %(port)s state set to %(state)s.') % {
"port": data['port'], "state": data['state']}
LOG.info(msg)
messages.success(request, msg)
return shortcuts.redirect(request.build_absolute_uri())
@login_required
def create(request, tenant_id, network_id):
create_form, handled = CreatePort.maybe_handle(request)
if handled:
return shortcuts.redirect(
'dash_networks_detail',
tenant_id=request.user.tenant_id,
network_id=network_id
)
return shortcuts.render_to_response(
'django_openstack/dash/ports/create.html', {
'network_id': network_id,
'create_form': create_form
}, context_instance=template.RequestContext(request))
@login_required
def attach(request, tenant_id, network_id, port_id):
attach_form, handled = AttachPort.maybe_handle(request)
if handled:
return shortcuts.redirect('dash_networks_detail',
request.user.tenant_id, network_id)
# Get all avaliable vifs
vifs = _get_available_vifs(request)
return shortcuts.render_to_response(
'django_openstack/dash/ports/attach.html', {
'network': network_id,
'port': port_id,
'attach_form': attach_form,
'vifs': vifs,
}, context_instance=template.RequestContext(request))
def _get_available_vifs(request):
"""
Method to get a list of available virtual interfaces
"""
vif_choices = []
vifs = api.get_vif_ids(request)
for vif in vifs:
if vif['available']:
name = "Instance %s VIF %s" % \
(str(vif['instance_name']), str(vif['id']))
vif_choices.append({
'name': str(name),
'id': str(vif['id'])
})
return vif_choices