Work in progress - just starting

This commit is contained in:
Salvatore Orlando 2011-06-28 18:04:27 +01:00
parent c0260982ac
commit d0cb0eea78
9 changed files with 184 additions and 168 deletions

View File

@ -143,7 +143,6 @@ class Controller(common.QuantumController):
#TODO - Complete implementation of these APIs
def attach_resource(self, request, tenant_id, network_id, id):
content_type = request.best_match_content_type()
print "Content type:%s" % content_type
try:
request_params = \
self._parse_request_params(request,

View File

@ -33,7 +33,6 @@ class ViewBuilder(object):
def build(self, network_data, is_detail=False):
"""Generic method used to generate a network entity."""
print "NETWORK-DATA:%s" % network_data
if is_detail:
network = self._build_detail(network_data)
else:

View File

@ -31,7 +31,6 @@ class ViewBuilder(object):
def build(self, port_data, is_detail=False):
"""Generic method used to generate a port entity."""
print "PORT-DATA:%s" % port_data
if is_detail:
port = self._build_detail(port_data)
else:

View File

@ -25,16 +25,15 @@ class.
The caller should make sure that QuantumManager is a singleton.
"""
import gettext
import logging
import os
gettext.install('quantum', unicode=1)
import os
from common import utils
from quantum_plugin_base import QuantumPluginBase
CONFIG_FILE = "plugins.ini"
LOG = logging.getLogger('quantum.manager')
def find_config(basepath):
for root, dirs, files in os.walk(basepath):
@ -51,14 +50,14 @@ class QuantumManager(object):
else:
self.configuration_file = config
plugin_location = utils.getPluginFromConfig(self.configuration_file)
print "PLUGIN LOCATION:%s" % plugin_location
plugin_klass = utils.import_class(plugin_location)
LOG.debug("Plugin location:%s", plugin_location)
if not issubclass(plugin_klass, QuantumPluginBase):
raise Exception("Configured Quantum plug-in " \
"didn't pass compatibility test")
else:
print("Successfully imported Quantum plug-in." \
"All compatibility tests passed\n")
LOG.debug("Successfully imported Quantum plug-in." \
"All compatibility tests passed")
self.plugin = plugin_klass()
def get_manager(self):

View File

@ -14,9 +14,13 @@
# License for the specific language governing permissions and limitations
# under the License.
# @author: Somik Behera, Nicira Networks, Inc.
# @author: Salvatore Orlando, Citrix
import logging
from quantum.common import exceptions as exc
LOG = logging.getLogger('quantum.plugins.SamplePlugin')
class QuantumEchoPlugin(object):
@ -290,7 +294,7 @@ class FakePlugin(object):
<network_uuid, network_name> for
the specified tenant.
"""
print("get_all_networks() called\n")
LOG.debug("FakePlugin.get_all_networks() called")
return FakePlugin._networks.values()
def get_network_details(self, tenant_id, net_id):
@ -298,7 +302,7 @@ class FakePlugin(object):
retrieved a list of all the remote vifs that
are attached to the network
"""
print("get_network_details() called\n")
LOG.debug("get_network_details() called")
return self._get_network(tenant_id, net_id)
def create_network(self, tenant_id, net_name):
@ -306,11 +310,10 @@ class FakePlugin(object):
Creates a new Virtual Network, and assigns it
a symbolic name.
"""
print("create_network() called\n")
LOG.debug("FakePlugin.create_network() called")
FakePlugin._net_counter += 1
new_net_id = ("0" * (3 - len(str(FakePlugin._net_counter)))) + \
str(FakePlugin._net_counter)
print new_net_id
new_net_dict = {'net-id': new_net_id,
'net-name': net_name,
'net-ports': {}}
@ -323,7 +326,7 @@ class FakePlugin(object):
Deletes the network with the specified network identifier
belonging to the specified tenant.
"""
print("delete_network() called\n")
LOG.debug("FakePlugin.delete_network() called")
net = FakePlugin._networks.get(net_id)
# Verify that no attachments are plugged into the network
if net:
@ -341,7 +344,7 @@ class FakePlugin(object):
Updates the symbolic name belonging to a particular
Virtual Network.
"""
print("rename_network() called\n")
LOG.debug("FakePlugin.rename_network() called")
net = self._get_network(tenant_id, net_id)
net['net-name'] = new_name
return net
@ -351,7 +354,7 @@ class FakePlugin(object):
Retrieves all port identifiers belonging to the
specified Virtual Network.
"""
print("get_all_ports() called\n")
LOG.debug("FakePlugin.get_all_ports() called")
network = self._get_network(tenant_id, net_id)
ports_on_net = network['net-ports'].values()
return ports_on_net
@ -361,14 +364,14 @@ class FakePlugin(object):
This method allows the user to retrieve a remote interface
that is attached to this particular port.
"""
print("get_port_details() called\n")
LOG.debug("FakePlugin.get_port_details() called")
return self._get_port(tenant_id, net_id, port_id)
def create_port(self, tenant_id, net_id, port_state=None):
"""
Creates a port on the specified Virtual Network.
"""
print("create_port() called\n")
LOG.debug("FakePlugin.create_port() called")
net = self._get_network(tenant_id, net_id)
# check port state
# TODO(salvatore-orlando): Validate port state in API?
@ -388,7 +391,7 @@ class FakePlugin(object):
"""
Updates the state of a port on the specified Virtual Network.
"""
print("create_port() called\n")
LOG.debug("FakePlugin.update_port() called")
port = self._get_port(tenant_id, net_id, port_id)
self._validate_port_state(port_state)
port['port-state'] = port_state
@ -401,7 +404,7 @@ class FakePlugin(object):
the remote interface is first un-plugged and then the port
is deleted.
"""
print("delete_port() called\n")
LOG.debug("FakePlugin.delete_port() called")
net = self._get_network(tenant_id, net_id)
port = self._get_port(tenant_id, net_id, port_id)
if port['attachment']:
@ -417,7 +420,7 @@ class FakePlugin(object):
Attaches a remote interface to the specified port on the
specified Virtual Network.
"""
print("plug_interface() called\n")
LOG.debug("FakePlugin.plug_interface() called")
# Validate attachment
self._validate_attachment(tenant_id, net_id, port_id,
remote_interface_id)
@ -432,16 +435,8 @@ class FakePlugin(object):
Detaches a remote interface from the specified port on the
specified Virtual Network.
"""
print("unplug_interface() called\n")
LOG.debug("FakePlugin.unplug_interface() called")
port = self._get_port(tenant_id, net_id, port_id)
# TODO(salvatore-orlando):
# Should unplug on port without attachment raise an Error?
port['attachment'] = None
def get_interface_details(self, tenant_id, net_id, port_id):
"""
Get Attachment details
"""
print("get_interface_details() called\n")
port = self._get_port(tenant_id, net_id, port_id)
return port["attachment"]

View File

@ -63,6 +63,7 @@ To run a single functional test module::
"""
import gettext
import logging
import os
import unittest
import sys
@ -281,12 +282,19 @@ class QuantumTestRunner(core.TextTestRunner):
if __name__ == '__main__':
# Set up test logger.
logger = logging.getLogger()
hdlr = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.DEBUG)
working_dir = os.path.abspath("tests")
c = config.Config(stream=sys.stdout,
env=os.environ,
verbosity=3,
workingDir=working_dir)
runner = QuantumTestRunner(stream=c.stream,
verbosity=c.verbosity,
config=c)

View File

@ -2,7 +2,7 @@
function usage {
echo "Usage: $0 [OPTION]..."
echo "Run Melange's test suite(s)"
echo "Run Quantum's test suite(s)"
echo ""
echo " -V, --virtual-env Always use virtualenv. Install automatically if not present"
echo " -N, --no-virtual-env Don't use virtualenv. Run tests in local environment"

View File

@ -50,168 +50,168 @@ class QuantumTest(unittest.TestCase):
def setUp(self):
self.client = MiniClient(HOST, PORT, USE_SSL)
def create_network(self, data, tenant_id=TENANT_ID):
content_type = "application/" + FORMAT
body = Serializer().serialize(data, content_type)
res = self.client.do_request(tenant_id, 'POST', "/networks." + FORMAT,
body=body)
self.assertEqual(res.status, 200, "bad response: %s" % res.read())
#def create_network(self, data, tenant_id=TENANT_ID):
# content_type = "application/" + FORMAT
# body = Serializer().serialize(data, content_type)
# res = self.client.do_request(tenant_id, 'POST', "/networks." + FORMAT,
# body=body)
# self.assertEqual(res.status, 200, "bad response: %s" % res.read())
def test_listNetworks(self):
self.create_network(test_network1_data)
self.create_network(test_network2_data)
res = self.client.do_request(TENANT_ID, 'GET', "/networks." + FORMAT)
self.assertEqual(res.status, 200, "bad response: %s" % res.read())
#def test_listNetworks(self):
# self.create_network(test_network1_data)
# self.create_network(test_network2_data)
# res = self.client.do_request(TENANT_ID, 'GET', "/networks." + FORMAT)
# self.assertEqual(res.status, 200, "bad response: %s" % res.read())
def test_getNonexistentNetwork(self):
#def test_getNonexistentNetwork(self):
# TODO(bgh): parse exception and make sure it is NetworkNotFound
try:
res = self.client.do_request(TENANT_ID, 'GET',
"/networks/%s.%s" % ("8675309", "xml"))
self.assertEqual(res.status, 400)
except Exception, e:
print "Caught exception: %s" % (str(e))
#try:
# res = self.client.do_request(TENANT_ID, 'GET',
# "/networks/%s.%s" % ("8675309", "xml"))
# self.assertEqual(res.status, 400)
#except Exception, e:
# print "Caught exception: %s" % (str(e))
def test_deleteNonexistentNetwork(self):
#def test_deleteNonexistentNetwork(self):
# TODO(bgh): parse exception and make sure it is NetworkNotFound
try:
res = self.client.do_request(TENANT_ID, 'DELETE',
"/networks/%s.%s" % ("8675309", "xml"))
self.assertEqual(res.status, 400)
except Exception, e:
print "Caught exception: %s" % (str(e))
#try:
# res = self.client.do_request(TENANT_ID, 'DELETE',
# "/networks/%s.%s" % ("8675309", "xml"))
# self.assertEqual(res.status, 400)
#except Exception, e:
# print "Caught exception: %s" % (str(e))
def test_createNetwork(self):
self.create_network(test_network1_data)
#def test_createNetwork(self):
#self.create_network(test_network1_data)
def test_createPort(self):
self.create_network(test_network1_data)
res = self.client.do_request(TENANT_ID, 'GET', "/networks." + FORMAT)
resdict = json.loads(res.read())
for n in resdict["networks"]:
net_id = n["id"]
#def test_createPort(self):
#self.create_network(test_network1_data)
#res = self.client.do_request(TENANT_ID, 'GET', "/networks." + FORMAT)
#resdict = json.loads(res.read())
#for n in resdict["networks"]:
# net_id = n["id"]
# Step 1 - List Ports for network (should not find any)
res = self.client.do_request(TENANT_ID, 'GET',
"/networks/%s/ports.%s" % (net_id, FORMAT))
output = res.read()
self.assertEqual(res.status, 200, "Bad response: %s" % output)
if len(output) > 0:
resdict = json.loads(output)
self.assertTrue(len(resdict["ports"]) == 0,
"Found unexpected ports: %s" % output)
else:
self.assertTrue(len(output) == 0,
"Found unexpected ports: %s" % output)
#res = self.client.do_request(TENANT_ID, 'GET',
# "/networks/%s/ports.%s" % (net_id, FORMAT))
#output = res.read()
#self.assertEqual(res.status, 200, "Bad response: %s" % output)
#if len(output) > 0:
# resdict = json.loads(output)
# self.assertTrue(len(resdict["ports"]) == 0,
# "Found unexpected ports: %s" % output)
#else:
# self.assertTrue(len(output) == 0,
# "Found unexpected ports: %s" % output)
# Step 2 - Create Port for network
res = self.client.do_request(TENANT_ID, 'POST',
"/networks/%s/ports.%s" % (net_id, FORMAT))
self.assertEqual(res.status, 200, "Bad response: %s" % output)
#res = self.client.do_request(TENANT_ID, 'POST',
# "/networks/%s/ports.%s" % (net_id, FORMAT))
#self.assertEqual(res.status, 200, "Bad response: %s" % output)
# Step 3 - List Ports for network (again); should find one
res = self.client.do_request(TENANT_ID, 'GET',
"/networks/%s/ports.%s" % (net_id, FORMAT))
output = res.read()
self.assertEqual(res.status, 200, "Bad response: %s" % output)
resdict = json.loads(output)
ids = []
for p in resdict["ports"]:
ids.append(p["id"])
self.assertTrue(len(ids) == 1,
"Didn't find expected # of ports (1): %s" % ids)
#res = self.client.do_request(TENANT_ID, 'GET',
# "/networks/%s/ports.%s" % (net_id, FORMAT))
#output = res.read()
#self.assertEqual(res.status, 200, "Bad response: %s" % output)
#resdict = json.loads(output)
#ids = []
#for p in resdict["ports"]:
# ids.append(p["id"])
#self.assertTrue(len(ids) == 1,
# "Didn't find expected # of ports (1): %s" % ids)
def test_getAttachment(self):
self.create_network(test_network1_data)
res = self.client.do_request(TENANT_ID, 'GET', "/networks." + FORMAT)
resdict = json.loads(res.read())
for n in resdict["networks"]:
net_id = n["id"]
#def test_getAttachment(self):
#self.create_network(test_network1_data)
#res = self.client.do_request(TENANT_ID, 'GET', "/networks." + FORMAT)
#resdict = json.loads(res.read())
#for n in resdict["networks"]:
# net_id = n["id"]
# Step 1 - Create Port for network and attempt to get the
# attachment (even though there isn't one)
res = self.client.do_request(TENANT_ID, 'POST',
"/networks/%s/ports.%s" % (net_id, FORMAT))
output = res.read()
self.assertEqual(res.status, 200, "Bad response: %s" % output)
resdict = json.loads(output)
port_id = resdict["ports"]["port"]["id"]
#res = self.client.do_request(TENANT_ID, 'POST',
# "/networks/%s/ports.%s" % (net_id, FORMAT))
#output = res.read()
#self.assertEqual(res.status, 200, "Bad response: %s" % output)
#resdict = json.loads(output)
#port_id = resdict["ports"]["port"]["id"]
res = self.client.do_request(TENANT_ID, 'GET',
"/networks/%s/ports/%s/attachment.%s" % (net_id, port_id,
FORMAT))
output = res.read()
self.assertEqual(res.status, 200, "Bad response: %s" % output)
#res = self.client.do_request(TENANT_ID, 'GET',
# "/networks/%s/ports/%s/attachment.%s" % (net_id, port_id,
# FORMAT))
#output = res.read()
#self.assertEqual(res.status, 200, "Bad response: %s" % output)
# Step 2 - Add an attachment
data = {'port': {'attachment-id': 'fudd'}}
content_type = "application/" + FORMAT
body = Serializer().serialize(data, content_type)
res = self.client.do_request(TENANT_ID, 'PUT',
"/networks/%s/ports/%s/attachment.%s" % (net_id, port_id,
FORMAT), body=body)
output = res.read()
self.assertEqual(res.status, 202, "Bad response: %s" % output)
#data = {'port': {'attachment-id': 'fudd'}}
#content_type = "application/" + FORMAT
#body = Serializer().serialize(data, content_type)
#res = self.client.do_request(TENANT_ID, 'PUT',
# "/networks/%s/ports/%s/attachment.%s" % (net_id, port_id,
# FORMAT), body=body)
#output = res.read()
#self.assertEqual(res.status, 202, "Bad response: %s" % output)
# Step 3 - Fetch the attachment
res = self.client.do_request(TENANT_ID, 'GET',
"/networks/%s/ports/%s/attachment.%s" % (net_id, port_id,
FORMAT))
output = res.read()
self.assertEqual(res.status, 200, "Bad response: %s" % output)
resdict = json.loads(output)
attachment = resdict["attachment"]
self.assertEqual(attachment, "fudd", "Attachment: %s" % attachment)
#res = self.client.do_request(TENANT_ID, 'GET',
# "/networks/%s/ports/%s/attachment.%s" % (net_id, port_id,
# FORMAT))
#output = res.read()
#self.assertEqual(res.status, 200, "Bad response: %s" % output)
#resdict = json.loads(output)
#attachment = resdict["attachment"]
#self.assertEqual(attachment, "fudd", "Attachment: %s" % attachment)
def test_renameNetwork(self):
self.create_network(test_network1_data)
res = self.client.do_request(TENANT_ID, 'GET', "/networks." + FORMAT)
resdict = json.loads(res.read())
net_id = resdict["networks"][0]["id"]
#def test_renameNetwork(self):
#self.create_network(test_network1_data)
#res = self.client.do_request(TENANT_ID, 'GET', "/networks." + FORMAT)
#resdict = json.loads(res.read())
#net_id = resdict["networks"][0]["id"]
data = test_network1_data.copy()
data['network']['network-name'] = 'test_renamed'
content_type = "application/" + FORMAT
body = Serializer().serialize(data, content_type)
res = self.client.do_request(TENANT_ID, 'PUT',
"/networks/%s.%s" % (net_id, FORMAT), body=body)
resdict = json.loads(res.read())
self.assertTrue(resdict["networks"]["network"]["id"] == net_id,
"Network_rename: renamed network has a different uuid")
self.assertTrue(
resdict["networks"]["network"]["name"] == "test_renamed",
"Network rename didn't take effect")
#data = test_network1_data.copy()
#data['network']['network-name'] = 'test_renamed'
#content_type = "application/" + FORMAT
#body = Serializer().serialize(data, content_type)
#res = self.client.do_request(TENANT_ID, 'PUT',
#"/networks/%s.%s" % (net_id, FORMAT), body=body)
#resdict = json.loads(res.read())
#self.assertTrue(resdict["networks"]["network"]["id"] == net_id,
#"Network_rename: renamed network has a different uuid")
#self.assertTrue(
#resdict["networks"]["network"]["name"] == "test_renamed",
#"Network rename didn't take effect")
def test_createNetworkOnMultipleTenants(self):
#def test_createNetworkOnMultipleTenants(self):
# Create the same network on multiple tenants
self.create_network(test_network1_data, "tenant1")
self.create_network(test_network1_data, "tenant2")
#self.create_network(test_network1_data, "tenant1")
#self.create_network(test_network1_data, "tenant2")
def delete_networks(self, tenant_id=TENANT_ID):
#def delete_networks(self, tenant_id=TENANT_ID):
# Remove all the networks created on the tenant (including ports and
# attachments)
res = self.client.do_request(tenant_id, 'GET',
"/networks." + FORMAT)
resdict = json.loads(res.read())
for n in resdict["networks"]:
net_id = n["id"]
# Delete all the ports
res = self.client.do_request(tenant_id, 'GET',
"/networks/%s/ports.%s" % (net_id, FORMAT))
output = res.read()
self.assertEqual(res.status, 200, "Bad response: %s" % output)
resdict = json.loads(output)
ids = []
for p in resdict["ports"]:
res = self.client.do_request(tenant_id, 'DELETE',
"/networks/%s/ports/%s/attachment.%s" % (net_id, p["id"],
FORMAT))
res = self.client.do_request(tenant_id, 'DELETE',
"/networks/%s/ports/%s.%s" % (net_id, p["id"], FORMAT))
#res = self.client.do_request(tenant_id, 'GET',
# "/networks." + FORMAT)
#resdict = json.loads(res.read())
#for n in resdict["networks"]:
# net_id = n["id"]
# # Delete all the ports
# res = self.client.do_request(tenant_id, 'GET',
# "/networks/%s/ports.%s" % (net_id, FORMAT))
# output = res.read()
# self.assertEqual(res.status, 200, "Bad response: %s" % output)
# resdict = json.loads(output)
# ids = []
# for p in resdict["ports"]:
# res = self.client.do_request(tenant_id, 'DELETE',
# "/networks/%s/ports/%s/attachment.%s" % (net_id, p["id"],
# FORMAT))
# res = self.client.do_request(tenant_id, 'DELETE',
# "/networks/%s/ports/%s.%s" % (net_id, p["id"], FORMAT))
# Now, remove the network
res = self.client.do_request(tenant_id, 'DELETE',
"/networks/" + net_id + "." + FORMAT)
self.assertEqual(res.status, 202)
# res = self.client.do_request(tenant_id, 'DELETE',
# "/networks/" + net_id + "." + FORMAT)
# self.assertEqual(res.status, 202)
def tearDown(self):
self.delete_networks()

View File

@ -1,13 +1,30 @@
import quantum.api.ports as ports
import quantum.api.networks as networks
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2010-2011 ????
# All Rights Reserved.
#
# 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.
# @author: Brad Hall, Nicira Networks
# @author: Salvatore Orlando, Citrix Systems
import tests.unit.testlib as testlib
import unittest
from quantum import api as server
class APIPortsTest(unittest.TestCase):
def setUp(self):
self.port = ports.Controller()
self.network = networks.Controller()
self.api = server.APIRouterv01()
# Fault names copied here for reference
#