diff --git a/quantum/api/ports.py b/quantum/api/ports.py index c2de0d75fbf..e93541dacb3 100644 --- a/quantum/api/ports.py +++ b/quantum/api/ports.py @@ -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, diff --git a/quantum/api/views/networks.py b/quantum/api/views/networks.py index 6630c6c39ac..98c69730e58 100644 --- a/quantum/api/views/networks.py +++ b/quantum/api/views/networks.py @@ -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: diff --git a/quantum/api/views/ports.py b/quantum/api/views/ports.py index dabc7cf0f31..87758453b93 100644 --- a/quantum/api/views/ports.py +++ b/quantum/api/views/ports.py @@ -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: diff --git a/quantum/manager.py b/quantum/manager.py index a9662d8eb6a..71a13fb9c76 100644 --- a/quantum/manager.py +++ b/quantum/manager.py @@ -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): diff --git a/quantum/plugins/SamplePlugin.py b/quantum/plugins/SamplePlugin.py index dcac672f29e..956ad4ca357 100644 --- a/quantum/plugins/SamplePlugin.py +++ b/quantum/plugins/SamplePlugin.py @@ -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): 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"] diff --git a/run_tests.py b/run_tests.py index acc8260b817..633a7604083 100644 --- a/run_tests.py +++ b/run_tests.py @@ -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) diff --git a/run_tests.sh b/run_tests.sh index aa72cbe22db..9c603c98254 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -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" diff --git a/tests/functional/test_service.py b/tests/functional/test_service.py index 12c648615bf..a3f8985c609 100644 --- a/tests/functional/test_service.py +++ b/tests/functional/test_service.py @@ -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() diff --git a/tests/unit/test_api.py b/tests/unit/test_api.py index ee189e5c3f1..0f955d6aedf 100644 --- a/tests/unit/test_api.py +++ b/tests/unit/test_api.py @@ -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 #