pep8 fixes for quantum integration files

Fixing PEP8 compliance issues for the quantum integration effort.
This commit is contained in:
Arvind Somya 2011-09-06 15:38:46 -04:00
parent 7428d9e7f0
commit e99c87b61a
5 changed files with 252 additions and 188 deletions

View File

@ -248,7 +248,7 @@ class ServiceCatalogException(api_exceptions.ApiException):
class VirtualInterface(APIResourceWrapper):
_attrs = ['id','mac_address']
_attrs = ['id', 'mac_address']
def url_for(request, service_name, admin=False):
@ -407,6 +407,7 @@ def snapshot_list_detailed(request):
return [Image(i) for i in glance_api(request)
.get_images_detailed(filters=filters)]
def snapshot_create(request, instance_id, name):
return extras_api(request).snapshots.create(instance_id, name)
@ -659,45 +660,59 @@ def swift_get_object_data(request, container_name, object_name):
container = swift_api(request).get_container(container_name)
return container.get_object(object_name).stream()
def quantum_list_networks(request):
return quantum_api(request).list_networks()
def quantum_network_details(request, network_id):
return quantum_api(request).show_network_details(network_id)
def quantum_list_ports(request, network_id):
return quantum_api(request).list_ports(network_id)
def quantum_port_details(request, network_id, port_id):
return quantum_api(request).show_port_details(network_id, port_id)
def quantum_create_network(request, data):
return quantum_api(request).create_network(data)
def quantum_delete_network(request, network_id):
return quantum_api(request).delete_network(network_id)
def quantum_update_network(request, network_id, data):
return quantum_api(request).update_network(network_id, data)
def quantum_create_port(request, network_id):
return quantum_api(request).create_port(network_id)
def quantum_delete_port(request, network_id, port_id):
return quantum_api(request).delete_port(network_id, port_id)
def quantum_attach_port(request, network_id, port_id, data):
return quantum_api(request).attach_resource(network_id, port_id, data)
def quantum_detach_port(request, network_id, port_id):
return quantum_api(request).detach_resource(network_id, port_id)
def quantum_set_port_state(request, network_id, port_id ,data):
return quantum_api(request).set_port_state(network_id, port_id, body)
def quantum_set_port_state(request, network_id, port_id, data):
return quantum_api(request).set_port_state(network_id, port_id, data)
def quantum_port_attachment(request, network_id, port_id):
return quantum_api(request).show_port_attachment(network_id, port_id)
def get_vif_ids(request):
vifs = []
attached_vifs = []
@ -707,32 +722,37 @@ def get_vif_ids(request):
ports = quantum_api(request).list_ports(network['id'])
# Get port attachments
for port in ports['ports']:
port_attachment = quantum_api(request).show_port_attachment(network['id'], port['id'])
port_attachment = quantum_api(request).show_port_attachment(
network['id'],
port['id'])
if port_attachment['attachment']:
attached_vifs.append(port_attachment['attachment']['id'].encode('ascii'))
attached_vifs.append(
port_attachment['attachment']['id'].encode('ascii'))
# Get all instances
instances = server_list(request)
# Get virtual interface ids by instance
for instance in instances:
instance_vifs = extras_api(request).virtual_interfaces.list(instance.id)
id = instance.id
instance_vifs = extras_api(request).virtual_interfaces.list(id)
for vif in instance_vifs:
# Check if this VIF is already connected to any port
if str(vif.id) in attached_vifs:
vifs.append({
'id' : vif.id,
'instance' : instance.id,
'instance_name' : instance.name,
'available' : False
'id': vif.id,
'instance': instance.id,
'instance_name': instance.name,
'available': False
})
else:
vifs.append({
'id' : vif.id,
'instance' : instance.id,
'instance_name' : instance.name,
'available' : True
'id': vif.id,
'instance': instance.id,
'instance_name': instance.name,
'available': True
})
return vifs
class GlobalSummary(object):
node_resources = ['vcpus', 'disk_size', 'ram_size']
unit_mem_size = {'disk_size': ['GiB', 'TiB'], 'ram_size': ['MiB', 'GiB']}

View File

@ -44,6 +44,7 @@ import warnings
LOG = logging.getLogger('django_openstack.dash.views.networks')
class CreateNetwork(forms.SelfHandlingForm):
name = forms.CharField(required=True, label="Network Name")
@ -63,7 +64,8 @@ class CreateNetwork(forms.SelfHandlingForm):
msg = 'Network %s has been created.' % network_name
LOG.info(msg)
messages.success(request, msg)
return shortcuts.redirect('dash_networks', tenant_id=request.user.tenant)
return shortcuts.redirect('dash_networks',
tenant_id=request.user.tenant)
class DeleteNetwork(forms.SelfHandlingForm):
@ -91,7 +93,8 @@ class RenameNetwork(forms.SelfHandlingForm):
def handle(self, request, data):
try:
LOG.info('Renaming network %s to %s' % (data['network'], data['new_name']))
LOG.info('Renaming network %s to %s' %
(data['network'], data['new_name']))
send_data = {'network': {'name': '%s' % data['new_name']}}
api.quantum_update_network(request, data['network'], send_data)
except Exception, e:
@ -99,7 +102,8 @@ class RenameNetwork(forms.SelfHandlingForm):
'Unable to rename network %s: %s' %
(data['network'], e.message,))
else:
msg = 'Network %s has been renamed to %s.' % (data['network'], data['new_name'])
msg = 'Network %s has been renamed to %s.' % \
(data['network'], data['new_name'])
LOG.info(msg)
messages.success(request, msg)
@ -121,12 +125,12 @@ def index(request, tenant_id):
# Get network details like name and id
details = api.quantum_network_details(request, network['id'])
networks.append({
'name' : details['network']['name'],
'id' : network['id'],
'total' : net_stats['total'],
'available' : net_stats['available'],
'used' : net_stats['used'],
'tenant' : tenant_id
'name': details['network']['name'],
'id': network['id'],
'total': net_stats['total'],
'available': net_stats['available'],
'used': net_stats['used'],
'tenant': tenant_id
})
except Exception, e:
@ -134,7 +138,7 @@ def index(request, tenant_id):
return shortcuts.render_to_response('dash_networks.html', {
'networks': networks,
'delete_form' : delete_form,
'delete_form': delete_form,
}, context_instance=template.RequestContext(request))
@ -145,14 +149,14 @@ def create(request, tenant_id):
return shortcuts.redirect('dash_networks', request.user.tenant)
return shortcuts.render_to_response('dash_network_create.html', {
'network_form' : network_form
'network_form': network_form
}, context_instance=template.RequestContext(request))
@login_required
def detail(request, tenant_id, network_id):
delete_port_form, delete_handled = DeletePort.maybe_handle(request)
detach_port_form, detach_handled = DetachPort.maybe_handle(request)
delete_port_form, delete_handled = DeletePort.maybe_handle(request)
detach_port_form, detach_handled = DetachPort.maybe_handle(request)
toggle_port_form, port_toggle_handled = TogglePort.maybe_handle(request)
network = {}
@ -163,14 +167,14 @@ def detail(request, tenant_id, network_id):
network['id'] = network_id
network['ports'] = _get_port_states(request, tenant_id, network_id)
except Exception, e:
messages.error(request, 'Unable to get network details: %s' % e.message)
messages.error(request, 'Unable to get network details:%s' % e.message)
return shortcuts.render_to_response('dash_networks_detail.html', {
'network': network,
'tenant' : tenant_id,
'delete_port_form' : delete_port_form,
'detach_port_form' : detach_port_form,
'toggle_port_form' : toggle_port_form
'tenant': tenant_id,
'delete_port_form': delete_port_form,
'detach_port_form': detach_port_form,
'toggle_port_form': toggle_port_form
}, context_instance=template.RequestContext(request))
@ -183,14 +187,15 @@ def rename(request, tenant_id, network_id):
return shortcuts.redirect('dash_networks', request.user.tenant)
return shortcuts.render_to_response('dash_network_rename.html', {
'network' : network_details,
'rename_form' : rename_form
'network': network_details,
'rename_form': rename_form
}, context_instance=template.RequestContext(request))
"""
Helper method to find port states for a network
"""
def _get_port_states(request, tenant_id, network_id):
"""
Helper method to find port states for a network
"""
network_ports = []
# Get all vifs for comparison with port attachments
vifs = api.get_vif_ids(request)
@ -198,9 +203,11 @@ def _get_port_states(request, tenant_id, network_id):
# Get all ports on this network
ports = api.quantum_list_ports(request, network_id)
for port in ports['ports']:
port_details = api.quantum_port_details(request, network_id, port['id'])
port_details = api.quantum_port_details(request,
network_id, port['id'])
# Get port attachments
port_attachment = api.quantum_port_attachment(request, network_id, port['id'])
port_attachment = api.quantum_port_attachment(request,
network_id, port['id'])
# Find instance the attachment belongs to
connected_instance = None
if port_attachment['attachment']:
@ -209,17 +216,18 @@ def _get_port_states(request, tenant_id, network_id):
connected_instance = vif['instance_name']
break
network_ports.append({
'id' : port_details['port']['id'],
'state' : port_details['port']['state'],
'attachment' : port_attachment['attachment'],
'instance' : connected_instance
'id': port_details['port']['id'],
'state': port_details['port']['state'],
'attachment': port_attachment['attachment'],
'instance': connected_instance
})
return network_ports
"""
Helper method to calculate statistics for a network
"""
def _calc_network_stats(request, tenant_id, network_id):
"""
Helper method to calculate statistics for a network
"""
# Get all ports statistics for the network
total = 0
available = 0
@ -228,10 +236,11 @@ def _calc_network_stats(request, tenant_id, network_id):
for port in ports['ports']:
total += 1
# Get port attachment
port_attachment = api.quantum_port_attachment(request, network_id, port['id'])
port_attachment = api.quantum_port_attachment(request,
network_id, port['id'])
if port_attachment['attachment']:
used += 1
else:
available += 1
return { 'total' : total, 'used' : used, 'available': available }
return {'total': total, 'used': used, 'available': available}

View File

@ -44,15 +44,17 @@ class CreatePort(forms.SelfHandlingForm):
def handle(self, request, data):
try:
LOG.info('Creating %s ports on network %s' % (data['ports_num'], data['network']))
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 %s: %s' %
(data['network'], e.message,))
(data['network'], e.message))
else:
msg = '%s ports created on network %s.' % (data['ports_num'], data['network'])
msg = '%s ports created on network %s.' % \
(data['ports_num'], data['network'])
LOG.info(msg)
messages.success(request, msg)
@ -65,14 +67,16 @@ class DeletePort(forms.SelfHandlingForm):
def handle(self, request, data):
try:
LOG.info('Deleting %s ports on network %s' % (data['port'], data['network']))
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 %s: %s' %
(data['port'], e.message,))
else:
msg = 'Port %s deleted from network %s.' % (data['port'], data['network'])
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())
@ -81,19 +85,23 @@ class DeletePort(forms.SelfHandlingForm):
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")
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']))
LOG.info('Attaching %s port to VIF %s' %
(data['port'], data['vif_id']))
body = {'attachment': {'id': '%s' % data['vif_id']}}
api.quantum_attach_resource(request, data['network'], data['port'], body)
api.quantum_attach_port(request,
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 connected to VIF %s.' % (data['port'], data['vif_id'])
msg = 'Port %s connected to VIF %s.' % \
(data['port'], data['vif_id'])
LOG.info(msg)
messages.success(request, msg)
return shortcuts.redirect(request.build_absolute_uri())
@ -106,7 +114,7 @@ class DetachPort(forms.SelfHandlingForm):
def handle(self, request, data):
try:
LOG.info('Detaching port %s' % data['port'])
api.quantum_detach_resource(request, data['network'], data['port'])
api.quantum_detach_port(request, data['network'], data['port'])
except Exception, e:
messages.error(request,
'Unable to detach port %s: %s' %
@ -127,13 +135,14 @@ class TogglePort(forms.SelfHandlingForm):
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)
api.quantum_set_port_state(request,
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'])
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())
@ -141,7 +150,7 @@ class TogglePort(forms.SelfHandlingForm):
@login_required
def create(request, tenant_id, network_id):
create_form, handled = CreatePort.maybe_handle(request)
create_form, handled = CreatePort.maybe_handle(request)
if handled:
return shortcuts.redirect(
@ -151,42 +160,44 @@ def create(request, tenant_id, network_id):
)
return shortcuts.render_to_response('dash_ports_create.html', {
'network_id' : network_id,
'create_form' : create_form
'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)
attach_form, handled = AttachPort.maybe_handle(request)
if handled:
return shortcuts.redirect('dash_networks_detail', request.user.tenant, network_id)
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,
'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):
"""
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']))
name = "Instance %s VIF %s" % \
(str(vif['instance_name']), str(vif['id']))
vif_choices.append({
'name' : str(name),
'id' : str(vif['id'])
'name': str(name),
'id': str(vif['id'])
})
return vif_choices

View File

@ -6,41 +6,46 @@ from django_openstack.tests.view_tests import base
from mox import IgnoreArg, IsA
import quantum.client
class NetworkViewTests(base.BaseViewTests):
def setUp(self):
super(NetworkViewTests, self).setUp()
self.network = {}
self.network['networks'] = []
self.network['networks'].append({'id' : 'n1'})
self.network_details = {'network' : {'name' : 'test_network'}}
self.network['networks'].append({'id': 'n1'})
self.network_details = {'network': {'name': 'test_network'}}
self.ports = {}
self.ports['ports'] = []
self.ports['ports'].append({'id' : 'p1'})
self.ports['ports'].append({'id': 'p1'})
self.port_details = {
'port' : {
'id' : 'p1',
'state' : 'DOWN'
'port': {
'id': 'p1',
'state': 'DOWN'
}
}
self.port_attachment = {
'attachment' : {
'id' : 'vif1'
'attachment': {
'id': 'vif1'
}
}
self.vifs = [{ 'id' : 'vif1' }]
self.vifs = [{'id': 'vif1'}]
def test_network_index(self):
self.mox.StubOutWithMock(api, 'quantum_list_networks')
api.quantum_list_networks(IsA(http.HttpRequest)).AndReturn(self.network)
api.quantum_list_networks(IsA(http.HttpRequest)).\
AndReturn(self.network)
self.mox.StubOutWithMock(api, 'quantum_network_details')
api.quantum_network_details(IsA(http.HttpRequest), 'n1').AndReturn(self.network_details)
api.quantum_network_details(IsA(http.HttpRequest),
'n1').AndReturn(self.network_details)
self.mox.StubOutWithMock(api, 'quantum_list_ports')
api.quantum_list_ports(IsA(http.HttpRequest), 'n1').AndReturn(self.ports)
api.quantum_list_ports(IsA(http.HttpRequest),
'n1').AndReturn(self.ports)
self.mox.StubOutWithMock(api, 'quantum_port_attachment')
api.quantum_port_attachment(IsA(http.HttpRequest), 'n1', 'p1').AndReturn(self.port_attachment)
api.quantum_port_attachment(IsA(http.HttpRequest),
'n1', 'p1').AndReturn(self.port_attachment)
self.mox.ReplayAll()
@ -81,16 +86,20 @@ class NetworkViewTests(base.BaseViewTests):
api.quantum_delete_network(IsA(http.HttpRequest), 'n1').AndReturn(True)
self.mox.StubOutWithMock(api, 'quantum_list_networks')
api.quantum_list_networks(IsA(http.HttpRequest)).AndReturn(self.network)
api.quantum_list_networks(IsA(http.HttpRequest)).\
AndReturn(self.network)
self.mox.StubOutWithMock(api, 'quantum_network_details')
api.quantum_network_details(IsA(http.HttpRequest), 'n1').AndReturn(self.network_details)
api.quantum_network_details(IsA(http.HttpRequest),
'n1').AndReturn(self.network_details)
self.mox.StubOutWithMock(api, 'quantum_list_ports')
api.quantum_list_ports(IsA(http.HttpRequest), 'n1').AndReturn(self.ports)
api.quantum_list_ports(IsA(http.HttpRequest),
'n1').AndReturn(self.ports)
self.mox.StubOutWithMock(api, 'quantum_port_attachment')
api.quantum_port_attachment(IsA(http.HttpRequest), 'n1', 'p1').AndReturn(self.port_attachment)
api.quantum_port_attachment(IsA(http.HttpRequest),
'n1', 'p1').AndReturn(self.port_attachment)
self.mox.ReplayAll()
@ -103,23 +112,28 @@ class NetworkViewTests(base.BaseViewTests):
def test_network_rename(self):
self.mox.StubOutWithMock(api, "quantum_update_network")
api.quantum_update_network(IsA(http.HttpRequest), 'n1', dict).AndReturn(True)
api.quantum_update_network(IsA(http.HttpRequest),
'n1', dict).AndReturn(True)
self.mox.StubOutWithMock(api, 'quantum_list_networks')
api.quantum_list_networks(IsA(http.HttpRequest)).AndReturn(self.network)
api.quantum_list_networks(IsA(http.HttpRequest)).\
AndReturn(self.network)
self.mox.StubOutWithMock(api, 'quantum_network_details')
api.quantum_network_details(IsA(http.HttpRequest), 'n1').AndReturn(self.network_details)
api.quantum_network_details(IsA(http.HttpRequest),
'n1').AndReturn(self.network_details)
self.mox.StubOutWithMock(api, 'quantum_list_ports')
api.quantum_list_ports(IsA(http.HttpRequest), 'n1').AndReturn(self.ports)
api.quantum_list_ports(IsA(http.HttpRequest),
'n1').AndReturn(self.ports)
self.mox.StubOutWithMock(api, 'quantum_port_attachment')
api.quantum_port_attachment(IsA(http.HttpRequest), 'n1', 'p1').AndReturn(self.port_attachment)
api.quantum_port_attachment(IsA(http.HttpRequest),
'n1', 'p1').AndReturn(self.port_attachment)
self.mox.ReplayAll()
formData = {'new_name' : 'Test1',
formData = {'new_name': 'Test1',
'method': 'RenameNetwork'}
res = self.client.post(reverse('dash_network_rename',
@ -128,23 +142,28 @@ class NetworkViewTests(base.BaseViewTests):
def test_network_details(self):
self.mox.StubOutWithMock(api, 'quantum_network_details')
api.quantum_network_details(IsA(http.HttpRequest), 'n1').AndReturn(self.network_details)
api.quantum_network_details(IsA(http.HttpRequest),
'n1').AndReturn(self.network_details)
self.mox.StubOutWithMock(api, 'quantum_list_ports')
api.quantum_list_ports(IsA(http.HttpRequest), 'n1').AndReturn(self.ports)
api.quantum_list_ports(IsA(http.HttpRequest),
'n1').AndReturn(self.ports)
self.mox.StubOutWithMock(api, 'quantum_port_attachment')
api.quantum_port_attachment(IsA(http.HttpRequest), 'n1', 'p1').AndReturn(self.port_attachment)
api.quantum_port_attachment(IsA(http.HttpRequest),
'n1', 'p1').AndReturn(self.port_attachment)
self.mox.StubOutWithMock(api, 'quantum_port_details')
api.quantum_port_details(IsA(http.HttpRequest), 'n1', 'p1').AndReturn(self.port_details)
api.quantum_port_details(IsA(http.HttpRequest),
'n1', 'p1').AndReturn(self.port_details)
self.mox.StubOutWithMock(api, 'get_vif_ids')
api.get_vif_ids(IsA(http.HttpRequest)).AndReturn(self.vifs)
self.mox.ReplayAll()
res = self.client.get(reverse('dash_networks_detail', args=['tenant', 'n1']))
res = self.client.get(reverse('dash_networks_detail',
args=['tenant', 'n1']))
self.assertTemplateUsed(res, 'dash_networks_detail.html')
self.assertIn('network', res.context)

View File

@ -6,6 +6,7 @@ from django_openstack.tests.view_tests import base
from mox import IgnoreArg, IsA
import quantum.client
class PortViewTests(base.BaseViewTests):
def setUp(self):
super(PortViewTests, self).setUp()
@ -14,8 +15,8 @@ class PortViewTests(base.BaseViewTests):
self.mox.StubOutWithMock(api, "quantum_create_port")
api.quantum_create_port(IsA(http.HttpRequest), 'n1').AndReturn(True)
formData = {'ports_num' : 1,
'network' : 'n1',
formData = {'ports_num': 1,
'network': 'n1',
'method': 'CreatePort'}
self.mox.StubOutWithMock(messages, 'success')
@ -26,14 +27,16 @@ class PortViewTests(base.BaseViewTests):
formData)
self.assertRedirectsNoFollow(res, reverse('dash_networks_detail',
args=[self.request.user.tenant, "n1"]))
args=[self.request.user.tenant,
"n1"]))
def test_port_delete(self):
self.mox.StubOutWithMock(api, "quantum_delete_port")
api.quantum_delete_port(IsA(http.HttpRequest), 'n1', 'p1').AndReturn(True)
api.quantum_delete_port(IsA(http.HttpRequest),
'n1', 'p1').AndReturn(True)
formData = {'port' : 'p1',
'network' : 'n1',
formData = {'port': 'p1',
'network': 'n1',
'method': 'DeletePort'}
self.mox.StubOutWithMock(messages, 'success')
@ -43,14 +46,14 @@ class PortViewTests(base.BaseViewTests):
args=[self.request.user.tenant, "n1"]),
formData)
def test_port_attach(self):
self.mox.StubOutWithMock(api, "quantum_attach_port")
api.quantum_attach_port(IsA(http.HttpRequest), 'n1', 'p1', dict).AndReturn(True)
api.quantum_attach_port(IsA(http.HttpRequest),
'n1', 'p1', dict).AndReturn(True)
formData = {'port' : 'p1',
'network' : 'n1',
'vif_id' : 'v1',
formData = {'port': 'p1',
'network': 'n1',
'vif_id': 'v1',
'method': 'AttachPort'}
self.mox.StubOutWithMock(messages, 'success')
@ -61,14 +64,16 @@ class PortViewTests(base.BaseViewTests):
formData)
self.assertRedirectsNoFollow(res, reverse('dash_networks_detail',
args=[self.request.user.tenant, "n1"]))
args=[self.request.user.tenant,
"n1"]))
def test_port_detach(self):
self.mox.StubOutWithMock(api, "quantum_detach_port")
api.quantum_detach_port(IsA(http.HttpRequest), 'n1', 'p1').AndReturn(True)
api.quantum_detach_port(IsA(http.HttpRequest),
'n1', 'p1').AndReturn(True)
formData = {'port' : 'p1',
'network' : 'n1',
formData = {'port': 'p1',
'network': 'n1',
'method': 'DetachPort'}
self.mox.StubOutWithMock(messages, 'success')