207 lines
7.4 KiB
Python
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
|