cf085cb6df
Closes-Bug: #1190615 This fix improves the unit test coverage for the Cisco Nexus plugin common modules (directory neutron/plugins/cisco/common) from: --- cisco_credentials_v2.py 82% --- cisco_faults.py 0% --- config.py 84% To: --- cisco_credentials_v2.py 100% --- cisco_faults.py 76% --- config.py 100% Change-Id: Id1ccfee1317309039fab83f622ced58efc3b2ae7
292 lines
13 KiB
Python
292 lines
13 KiB
Python
# Copyright (c) 2013 OpenStack Foundation
|
|
# 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.
|
|
|
|
import collections
|
|
import mock
|
|
import testtools
|
|
|
|
from neutron.db import api as db
|
|
from neutron.plugins.cisco.common import cisco_constants
|
|
from neutron.plugins.cisco.common import cisco_credentials_v2
|
|
from neutron.plugins.cisco.common import cisco_exceptions as c_exc
|
|
from neutron.plugins.cisco.common import config as config
|
|
from neutron.plugins.cisco.db import network_db_v2 as cdb
|
|
from neutron.plugins.cisco import network_plugin
|
|
from neutron.tests import base
|
|
|
|
|
|
class CiscoNetworkDbTest(base.BaseTestCase):
|
|
|
|
"""Base class for Cisco network database unit tests."""
|
|
|
|
def setUp(self):
|
|
super(CiscoNetworkDbTest, self).setUp()
|
|
db.configure_db()
|
|
|
|
# The Cisco network plugin includes a thin layer of QoS and
|
|
# credential API methods which indirectly call Cisco QoS and
|
|
# credential database access methods. For better code coverage,
|
|
# this test suite will make calls to the QoS and credential database
|
|
# access methods indirectly through the network plugin. The network
|
|
# plugin's init function can be mocked out for this purpose.
|
|
def new_network_plugin_init(instance):
|
|
pass
|
|
with mock.patch.object(network_plugin.PluginV2,
|
|
'__init__', new=new_network_plugin_init):
|
|
self._network_plugin = network_plugin.PluginV2()
|
|
|
|
self.addCleanup(db.clear_db)
|
|
|
|
|
|
class CiscoNetworkQosDbTest(CiscoNetworkDbTest):
|
|
|
|
"""Unit tests for Cisco network QoS database model."""
|
|
|
|
QosObj = collections.namedtuple('QosObj', 'tenant qname desc')
|
|
|
|
def _qos_test_obj(self, tnum, qnum, desc=None):
|
|
"""Create a Qos test object from a pair of numbers."""
|
|
if desc is None:
|
|
desc = 'test qos %s-%s' % (str(tnum), str(qnum))
|
|
tenant = 'tenant_%s' % str(tnum)
|
|
qname = 'qos_%s' % str(qnum)
|
|
return self.QosObj(tenant, qname, desc)
|
|
|
|
def _assert_equal(self, qos, qos_obj):
|
|
self.assertEqual(qos.tenant_id, qos_obj.tenant)
|
|
self.assertEqual(qos.qos_name, qos_obj.qname)
|
|
self.assertEqual(qos.qos_desc, qos_obj.desc)
|
|
|
|
def test_qos_add_remove(self):
|
|
qos11 = self._qos_test_obj(1, 1)
|
|
qos = self._network_plugin.create_qos(qos11.tenant, qos11.qname,
|
|
qos11.desc)
|
|
self._assert_equal(qos, qos11)
|
|
qos_id = qos.qos_id
|
|
qos = self._network_plugin.delete_qos(qos11.tenant, qos_id)
|
|
self._assert_equal(qos, qos11)
|
|
qos = self._network_plugin.delete_qos(qos11.tenant, qos_id)
|
|
self.assertIsNone(qos)
|
|
|
|
def test_qos_add_dup(self):
|
|
qos22 = self._qos_test_obj(2, 2)
|
|
qos = self._network_plugin.create_qos(qos22.tenant, qos22.qname,
|
|
qos22.desc)
|
|
self._assert_equal(qos, qos22)
|
|
qos_id = qos.qos_id
|
|
with testtools.ExpectedException(c_exc.QosNameAlreadyExists):
|
|
self._network_plugin.create_qos(qos22.tenant, qos22.qname,
|
|
"duplicate 22")
|
|
qos = self._network_plugin.delete_qos(qos22.tenant, qos_id)
|
|
self._assert_equal(qos, qos22)
|
|
qos = self._network_plugin.delete_qos(qos22.tenant, qos_id)
|
|
self.assertIsNone(qos)
|
|
|
|
def test_qos_get(self):
|
|
qos11 = self._qos_test_obj(1, 1)
|
|
qos11_id = self._network_plugin.create_qos(qos11.tenant, qos11.qname,
|
|
qos11.desc).qos_id
|
|
qos21 = self._qos_test_obj(2, 1)
|
|
qos21_id = self._network_plugin.create_qos(qos21.tenant, qos21.qname,
|
|
qos21.desc).qos_id
|
|
qos22 = self._qos_test_obj(2, 2)
|
|
qos22_id = self._network_plugin.create_qos(qos22.tenant, qos22.qname,
|
|
qos22.desc).qos_id
|
|
|
|
qos = self._network_plugin.get_qos_details(qos11.tenant, qos11_id)
|
|
self._assert_equal(qos, qos11)
|
|
qos = self._network_plugin.get_qos_details(qos21.tenant, qos21_id)
|
|
self._assert_equal(qos, qos21)
|
|
qos = self._network_plugin.get_qos_details(qos21.tenant, qos22_id)
|
|
self._assert_equal(qos, qos22)
|
|
|
|
with testtools.ExpectedException(c_exc.QosNotFound):
|
|
self._network_plugin.get_qos_details(qos11.tenant, "dummyQosId")
|
|
with testtools.ExpectedException(c_exc.QosNotFound):
|
|
self._network_plugin.get_qos_details(qos11.tenant, qos21_id)
|
|
with testtools.ExpectedException(c_exc.QosNotFound):
|
|
self._network_plugin.get_qos_details(qos21.tenant, qos11_id)
|
|
|
|
qos_all_t1 = self._network_plugin.get_all_qoss(qos11.tenant)
|
|
self.assertEqual(len(qos_all_t1), 1)
|
|
qos_all_t2 = self._network_plugin.get_all_qoss(qos21.tenant)
|
|
self.assertEqual(len(qos_all_t2), 2)
|
|
qos_all_t3 = self._network_plugin.get_all_qoss("tenant3")
|
|
self.assertEqual(len(qos_all_t3), 0)
|
|
|
|
def test_qos_update(self):
|
|
qos11 = self._qos_test_obj(1, 1)
|
|
qos11_id = self._network_plugin.create_qos(qos11.tenant, qos11.qname,
|
|
qos11.desc).qos_id
|
|
self._network_plugin.rename_qos(qos11.tenant, qos11_id,
|
|
new_name=None)
|
|
new_qname = "new qos name"
|
|
new_qos = self._network_plugin.rename_qos(qos11.tenant, qos11_id,
|
|
new_qname)
|
|
expected_qobj = self.QosObj(qos11.tenant, new_qname, qos11.desc)
|
|
self._assert_equal(new_qos, expected_qobj)
|
|
new_qos = self._network_plugin.get_qos_details(qos11.tenant, qos11_id)
|
|
self._assert_equal(new_qos, expected_qobj)
|
|
with testtools.ExpectedException(c_exc.QosNotFound):
|
|
self._network_plugin.rename_qos(qos11.tenant, "dummyQosId",
|
|
new_name=None)
|
|
|
|
|
|
class CiscoNetworkCredentialDbTest(CiscoNetworkDbTest):
|
|
|
|
"""Unit tests for Cisco network credentials database model."""
|
|
|
|
CredObj = collections.namedtuple('CredObj', 'cname usr pwd ctype')
|
|
|
|
def _cred_test_obj(self, tnum, cnum):
|
|
"""Create a Credential test object from a pair of numbers."""
|
|
cname = 'credential_%s_%s' % (str(tnum), str(cnum))
|
|
usr = 'User_%s_%s' % (str(tnum), str(cnum))
|
|
pwd = 'Password_%s_%s' % (str(tnum), str(cnum))
|
|
ctype = 'ctype_%s' % str(tnum)
|
|
return self.CredObj(cname, usr, pwd, ctype)
|
|
|
|
def _assert_equal(self, credential, cred_obj):
|
|
self.assertEqual(credential.type, cred_obj.ctype)
|
|
self.assertEqual(credential.credential_name, cred_obj.cname)
|
|
self.assertEqual(credential.user_name, cred_obj.usr)
|
|
self.assertEqual(credential.password, cred_obj.pwd)
|
|
|
|
def test_credential_add_remove(self):
|
|
cred11 = self._cred_test_obj(1, 1)
|
|
cred = cdb.add_credential(
|
|
cred11.cname, cred11.usr, cred11.pwd, cred11.ctype)
|
|
self._assert_equal(cred, cred11)
|
|
cred_id = cred.credential_id
|
|
cred = cdb.remove_credential(cred_id)
|
|
self._assert_equal(cred, cred11)
|
|
cred = cdb.remove_credential(cred_id)
|
|
self.assertIsNone(cred)
|
|
|
|
def test_credential_add_dup(self):
|
|
cred22 = self._cred_test_obj(2, 2)
|
|
cred = cdb.add_credential(
|
|
cred22.cname, cred22.usr, cred22.pwd, cred22.ctype)
|
|
self._assert_equal(cred, cred22)
|
|
cred_id = cred.credential_id
|
|
with testtools.ExpectedException(c_exc.CredentialAlreadyExists):
|
|
cdb.add_credential(
|
|
cred22.cname, cred22.usr, cred22.pwd, cred22.ctype)
|
|
cred = cdb.remove_credential(cred_id)
|
|
self._assert_equal(cred, cred22)
|
|
cred = cdb.remove_credential(cred_id)
|
|
self.assertIsNone(cred)
|
|
|
|
def test_credential_get_id(self):
|
|
cred11 = self._cred_test_obj(1, 1)
|
|
cred11_id = cdb.add_credential(
|
|
cred11.cname, cred11.usr, cred11.pwd, cred11.ctype).credential_id
|
|
cred21 = self._cred_test_obj(2, 1)
|
|
cred21_id = cdb.add_credential(
|
|
cred21.cname, cred21.usr, cred21.pwd, cred21.ctype).credential_id
|
|
cred22 = self._cred_test_obj(2, 2)
|
|
cred22_id = cdb.add_credential(
|
|
cred22.cname, cred22.usr, cred22.pwd, cred22.ctype).credential_id
|
|
|
|
cred = self._network_plugin.get_credential_details(cred11_id)
|
|
self._assert_equal(cred, cred11)
|
|
cred = self._network_plugin.get_credential_details(cred21_id)
|
|
self._assert_equal(cred, cred21)
|
|
cred = self._network_plugin.get_credential_details(cred22_id)
|
|
self._assert_equal(cred, cred22)
|
|
|
|
with testtools.ExpectedException(c_exc.CredentialNotFound):
|
|
self._network_plugin.get_credential_details("dummyCredentialId")
|
|
|
|
cred_all_t1 = self._network_plugin.get_all_credentials()
|
|
self.assertEqual(len(cred_all_t1), 3)
|
|
|
|
def test_credential_get_name(self):
|
|
cred11 = self._cred_test_obj(1, 1)
|
|
cred11_id = cdb.add_credential(
|
|
cred11.cname, cred11.usr, cred11.pwd, cred11.ctype).credential_id
|
|
cred21 = self._cred_test_obj(2, 1)
|
|
cred21_id = cdb.add_credential(
|
|
cred21.cname, cred21.usr, cred21.pwd, cred21.ctype).credential_id
|
|
cred22 = self._cred_test_obj(2, 2)
|
|
cred22_id = cdb.add_credential(
|
|
cred22.cname, cred22.usr, cred22.pwd, cred22.ctype).credential_id
|
|
self.assertNotEqual(cred11_id, cred21_id)
|
|
self.assertNotEqual(cred11_id, cred22_id)
|
|
self.assertNotEqual(cred21_id, cred22_id)
|
|
|
|
cred = cdb.get_credential_name(cred11.cname)
|
|
self._assert_equal(cred, cred11)
|
|
cred = cdb.get_credential_name(cred21.cname)
|
|
self._assert_equal(cred, cred21)
|
|
cred = cdb.get_credential_name(cred22.cname)
|
|
self._assert_equal(cred, cred22)
|
|
|
|
with testtools.ExpectedException(c_exc.CredentialNameNotFound):
|
|
cdb.get_credential_name("dummyCredentialName")
|
|
|
|
def test_credential_update(self):
|
|
cred11 = self._cred_test_obj(1, 1)
|
|
cred11_id = cdb.add_credential(
|
|
cred11.cname, cred11.usr, cred11.pwd, cred11.ctype).credential_id
|
|
self._network_plugin.rename_credential(cred11_id, new_name=None,
|
|
new_password=None)
|
|
new_usr = "new user name"
|
|
new_pwd = "new password"
|
|
new_credential = self._network_plugin.rename_credential(
|
|
cred11_id, new_usr, new_pwd)
|
|
expected_cred = self.CredObj(
|
|
cred11.cname, new_usr, new_pwd, cred11.ctype)
|
|
self._assert_equal(new_credential, expected_cred)
|
|
new_credential = self._network_plugin.get_credential_details(
|
|
cred11_id)
|
|
self._assert_equal(new_credential, expected_cred)
|
|
with testtools.ExpectedException(c_exc.CredentialNotFound):
|
|
self._network_plugin.rename_credential(
|
|
"dummyCredentialId", new_usr, new_pwd)
|
|
|
|
def test_get_credential_not_found_exception(self):
|
|
self.assertRaises(c_exc.CredentialNotFound,
|
|
self._network_plugin.get_credential_details,
|
|
"dummyCredentialId")
|
|
|
|
|
|
class CiscoCredentialStoreTest(base.BaseTestCase):
|
|
|
|
"""Cisco Credential Store unit tests."""
|
|
|
|
def setUp(self):
|
|
super(CiscoCredentialStoreTest, self).setUp()
|
|
db.configure_db()
|
|
self.addCleanup(db.clear_db)
|
|
|
|
def test_cred_store_init_duplicate_creds_ignored(self):
|
|
"""Check that with multi store instances, dup creds are ignored."""
|
|
# Create a device dictionary containing credentials for 1 switch.
|
|
dev_dict = {
|
|
('dev_id', '1.1.1.1', cisco_constants.USERNAME): 'user_1',
|
|
('dev_id', '1.1.1.1', cisco_constants.PASSWORD): 'password_1',
|
|
('dev_id', '1.1.1.1', 'host_a'): '1/1',
|
|
('dev_id', '1.1.1.1', 'host_b'): '1/2',
|
|
('dev_id', '1.1.1.1', 'host_c'): '1/3',
|
|
}
|
|
with mock.patch.object(config, 'get_device_dictionary',
|
|
return_value=dev_dict):
|
|
# Create and initialize 2 instances of credential store.
|
|
cisco_credentials_v2.Store().initialize()
|
|
cisco_credentials_v2.Store().initialize()
|
|
# There should be only 1 switch credential in the database.
|
|
self.assertEqual(len(cdb.get_all_credentials()), 1)
|