2011-08-26 15:11:25 -04:00

193 lines
7.0 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 Fourth Paradigm Development, 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_api(request).create_port(data['network'])
except Exception, e:
messages.error(request,
'Unable to create ports on network %s: %s' %
(data['network'], e.message,))
else:
msg = '%s ports created on network %s.' % (data['ports_num'], 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_api(request).delete_port(data['network'], data['port'])
except Exception, e:
messages.error(request,
'Unable to delete port %s: %s' %
(data['port'], e.message,))
else:
msg = 'Port %s deleted from network %s.' % (data['port'], 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 = {'port': {'attachment-id': '%s' % data['vif_id']}}
api.quantum_api(request).attach_resource(data['network'], data['port'], body)
except Exception, e:
messages.error(request,
'Unable to attach port %s to VIF %s: %s' %
(data['port'], data['vif_id'], e.message,))
else:
msg = 'Port %s connect to VIF %s.' % (data['port'], 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_api(request).detach_resource(data['network'], data['port'])
except Exception, e:
messages.error(request,
'Unable to detach port %s: %s' %
(data['port'], 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': {'port-state': '%s' % data['state']}}
api.quantum_api(request).set_port_state(data['network'], data['port'], body)
except Exception, e:
messages.error(request,
'Unable to set port state to %s: %s' %
(data['state'], e.message,))
else:
msg = 'Port %s state set to %s.' % (data['port'],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,
network_id=network_id
)
return shortcuts.render_to_response('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, network_id)
# Get all avaliable vifs
vifs = _get_available_vifs(request)
return shortcuts.render_to_response('dash_port_attach.html', {
'network' : network_id,
'port' : port_id,
'attach_form' : attach_form,
'vifs' : vifs,
}, context_instance=template.RequestContext(request))
"""
Method to get a list of available virtual interfaces
"""
def _get_available_vifs(request):
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