blueprint cisco-single-config

Scope: Unification of all the various plugin files for the Cisco plugin into a single file.

Use Cases: Quantum with the Cisco plugin.

Implementation Overview: All the config values contained in the various files in
etc/quantum/plugins/cisco will be unified into a single file
etc/quantum/plugins/cisco/cisco_plugin.ini. The plugins needs to be modified to
read from a single file instead of multiple.
Added quantum.openstack.common.cfg support.

Change-Id: I9ef356eccfe330c3733f441b96400d03c3d7d1df
This commit is contained in:
Rich Curran 2013-02-05 15:55:28 -05:00
parent 0deaadd145
commit f164a60f15
17 changed files with 212 additions and 296 deletions

View File

@ -1,6 +1,44 @@
[PLUGINS] [CISCO_PLUGINS]
#nexus_plugin=quantum.plugins.cisco.nexus.cisco_nexus_plugin_v2.NexusPlugin #nexus_plugin=quantum.plugins.cisco.nexus.cisco_nexus_plugin_v2.NexusPlugin
vswitch_plugin=quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2 #vswitch_plugin=quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2
[INVENTORY] [CISCO]
#nexus_plugin=quantum.plugins.cisco.nexus.cisco_nexus_inventory.NexusInventory #vlan_start=100
#vlan_end=3000
#vlan_name_prefix=q-
#max_ports=100
#max_port_profiles=65568
#max_networks=65568
#model_class=quantum.plugins.cisco.models.virt_phy_sw_v2.VirtualPhysicalSwitchModelV2
#manager_class=quantum.plugins.cisco.segmentation.l2network_vlan_mgr_v2.L2NetworkVLANMgr
#nexus_driver=quantum.plugins.cisco.tests.unit.v2.nexus.fake_nexus_driver.CiscoNEXUSFakeDriver
# IMPORTANT: Comment out the following two lines for production deployments
[CISCO_TEST]
host=testhost
#
# Nexus Switch Format.
# [NEXUS_SWITCH:<IP address of switch>]
# <hostname>=<port>
# ssh_port=<ssh port>
# username=<credential username>
# password=<credential password>
#
# Example:
# [NEXUS_SWITCH:1.1.1.1]
# compute1=1/1
# compute2=1/2
# ssh_port=22
# username=admin
# password=mySecretPassword
[DATABASE]
#
# This line MUST be changed to actually run the plugin.
# Example:
# sql_connection = mysql://quantum:password@127.0.0.1:3306/cisco_quantum
# Replace 127.0.0.1 above with the IP address of the database used by the
# main quantum server. (Leave it as is if the database runs on this host.)
#
#sql_connection=engine://user:pass@host/db_name

View File

@ -1,11 +0,0 @@
#Provide the Nexus credentials, if you are using Nexus
[<put_nexus_switch_ip_address_here>]
username=<put_user_name_here>
password=<put_password_here>
# Provide credentials and endpoint
# for keystone here
[keystone]
auth_url=<put_keystone_endpoint_here>
username=<put_user_name_here>
password=<put_password_here>

View File

@ -1,5 +0,0 @@
[DATABASE]
name = quantum_l2network
user = <put_db_user_name_here>
pass = <put_db_password_here>
host = <put_quantum_mysql_host_here>

View File

@ -1,23 +0,0 @@
[VLANS]
vlan_start=100
vlan_end=3000
vlan_name_prefix=q-
[PORTS]
max_ports=100
[PORTPROFILES]
max_port_profiles=65568
[NETWORKS]
max_networks=65568
[MODEL]
model_class=quantum.plugins.cisco.models.virt_phy_sw_v2.VirtualPhysicalSwitchModelV2
[SEGMENTATION]
manager_class=quantum.plugins.cisco.segmentation.l2network_vlan_mgr_v2.L2NetworkVLANMgr
# IMPORTANT: Comment the following lines for production deployments
[TEST]
host=testhost

View File

@ -1,14 +0,0 @@
[SWITCH]
# Ip address of the switch
[[<put_nexus_switch_ip_address_here>]]
# Hostname of the node
[[[<put_hostname_here>]]]
# Port this node is connected to on the nexus switch
ports=<put_port_id_here>
# Port number where the SSH will be running at the Nexus Switch, e.g.: 22 (Default)
[[[ssh_port]]]
ssh_port=<put_port_number_here>
[DRIVER]
#name=quantum.plugins.cisco.nexus.cisco_nexus_network_driver_v2.CiscoNEXUSDriver
name=quantum.plugins.cisco.tests.unit.v2.nexus.fake_nexus_driver.CiscoNEXUSFakeDriver

View File

@ -1,31 +0,0 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2011 Cisco Systems, Inc. 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: Sumit Naiksatam, Cisco Systems, Inc.
from configobj import ConfigObj
class CiscoConfigParser(ConfigObj):
"""Config Parser based on the ConfigObj module"""
def __init__(self, filename):
super(CiscoConfigParser, self).__init__(filename, raise_errors=True,
file_error=True)
def dummy(self, section, key):
"""Dummy function to return the same key, used in walk"""
return section[key]

View File

@ -18,8 +18,9 @@
import logging as LOG import logging as LOG
from quantum.common.utils import find_config_file from oslo.config import cfg
from quantum.plugins.cisco.common import cisco_configparser as confp
from quantum.plugins.cisco.common import config
from quantum.plugins.cisco.common import cisco_constants as const from quantum.plugins.cisco.common import cisco_constants as const
from quantum.plugins.cisco.common import cisco_exceptions as cexc from quantum.plugins.cisco.common import cisco_exceptions as cexc
from quantum.plugins.cisco.db import network_db_v2 as cdb from quantum.plugins.cisco.db import network_db_v2 as cdb
@ -28,12 +29,9 @@ from quantum.plugins.cisco.db import network_db_v2 as cdb
LOG.basicConfig(level=LOG.WARN) LOG.basicConfig(level=LOG.WARN)
LOG.getLogger(const.LOGGER_COMPONENT_NAME) LOG.getLogger(const.LOGGER_COMPONENT_NAME)
CREDENTIALS_FILE = find_config_file({'plugin': 'cisco'},
"credentials.ini")
TENANT = const.NETWORK_ADMIN TENANT = const.NETWORK_ADMIN
cp = confp.CiscoConfigParser(CREDENTIALS_FILE) _nexus_dict = config.get_nexus_dictionary()
_creds_dictionary = cp.walk(cp.dummy)
class Store(object): class Store(object):
@ -41,11 +39,12 @@ class Store(object):
@staticmethod @staticmethod
def initialize(): def initialize():
for id in _creds_dictionary.keys(): for keys in _nexus_dict.keys():
if keys[1] == const.USERNAME:
try: try:
cdb.add_credential(TENANT, id, cdb.add_credential(TENANT, keys[0],
_creds_dictionary[id][const.USERNAME], _nexus_dict[keys[0], const.USERNAME],
_creds_dictionary[id][const.PASSWORD]) _nexus_dict[keys[0], const.PASSWORD])
except cexc.CredentialAlreadyExists: except cexc.CredentialAlreadyExists:
# We are quietly ignoring this, since it only happens # We are quietly ignoring this, since it only happens
# if this class module is loaded more than once, in which # if this class module is loaded more than once, in which

View File

@ -0,0 +1,108 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2013 Cisco Systems, 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.
from oslo.config import cfg
from quantum.agent.common import config
cisco_test_opts = [
cfg.StrOpt('host',
default=None,
help=_("Cisco test host option.")),
]
cisco_plugins_opts = [
cfg.StrOpt('vswitch_plugin',
default='quantum.plugins.openvswitch.ovs_quantum_plugin.'
'OVSQuantumPluginV2',
help=_("Virtual Switch to use")),
cfg.StrOpt('nexus_plugin',
default='quantum.plugins.cisco.nexus.cisco_nexus_plugin_v2.'
'NexusPlugin',
help=_("Nexus Switch to use")),
]
cisco_opts = [
cfg.StrOpt('vlan_start', default='100',
help=_("VLAN start value")),
cfg.StrOpt('vlan_end', default='3000',
help=_("VLAN end value")),
cfg.StrOpt('vlan_name_prefix', default='q-',
help=_("VLAN Name prefix")),
cfg.StrOpt('max_ports', default='100',
help=_("Maximum Port value")),
cfg.StrOpt('max_port_profiles', default='65568',
help=_("Maximum Port Profile value")),
cfg.StrOpt('max_networks', default='65568',
help=_("Maximum Network value")),
cfg.StrOpt('model_class',
default='quantum.plugins.cisco.models.virt_phy_sw_v2.'
'VirtualPhysicalSwitchModelV2',
help=_("Model Class")),
cfg.StrOpt('manager_class',
default='quantum.plugins.cisco.segmentation.'
'l2network_vlan_mgr_v2.L2NetworkVLANMgr',
help=_("Manager Class")),
cfg.StrOpt('nexus_driver',
default='quantum.plugins.cisco.tests.unit.v2.nexus.'
'fake_nexus_driver.CiscoNEXUSFakeDriver',
help=_("Nexus Driver Name")),
]
cfg.CONF.register_opts(cisco_opts, "CISCO")
cfg.CONF.register_opts(cisco_plugins_opts, "CISCO_PLUGINS")
cfg.CONF.register_opts(cisco_test_opts, "CISCO_TEST")
config.register_root_helper(cfg.CONF)
# shortcuts
CISCO = cfg.CONF.CISCO
CISCO_PLUGINS = cfg.CONF.CISCO_PLUGINS
CISCO_TEST = cfg.CONF.CISCO_TEST
#
# When populated the nexus_dictionary format is:
# {('<nexus ipaddr>', '<key>'): '<value>', ...}
#
# Example:
# {('1.1.1.1', 'username'): 'admin',
# ('1.1.1.1', 'password'): 'mySecretPassword',
# ('1.1.1.1', 'compute1'): '1/1', ...}
#
nexus_dictionary = {}
class CiscoConfigOptions():
""" Cisco Configuration Options Class """
def __init__(self):
self._create_nexus_dictionary()
def _create_nexus_dictionary(self):
"""
Create the Nexus dictionary from the cisco_plugins.ini
NEXUS_SWITCH section(s).
"""
for parsed_file in cfg.CONF._cparser.parsed:
for parsed_item in parsed_file.keys():
nexus_name, sep, nexus_ip = parsed_item.partition(':')
if nexus_name == 'NEXUS_SWITCH':
for nexus_key, value in parsed_file[parsed_item].items():
nexus_dictionary[nexus_ip, nexus_key] = value[0]
def get_nexus_dictionary():
return nexus_dictionary

View File

@ -20,8 +20,8 @@ from sqlalchemy.orm import exc
from quantum.common import exceptions as q_exc from quantum.common import exceptions as q_exc
from quantum.openstack.common import log as logging from quantum.openstack.common import log as logging
from quantum.plugins.cisco.common import cisco_exceptions as c_exc from quantum.plugins.cisco.common import cisco_exceptions as c_exc
from quantum.plugins.cisco.common import config
from quantum.plugins.cisco.db import l2network_models from quantum.plugins.cisco.db import l2network_models
from quantum.plugins.cisco import l2network_plugin_configuration as conf
import quantum.plugins.cisco.db.api as db import quantum.plugins.cisco.db.api as db
@ -43,8 +43,8 @@ def create_vlanids():
except exc.MultipleResultsFound: except exc.MultipleResultsFound:
pass pass
except exc.NoResultFound: except exc.NoResultFound:
start = int(conf.VLAN_START) start = int(config.CISCO.vlan_start)
end = int(conf.VLAN_END) end = int(config.CISCO.vlan_end)
while start <= end: while start <= end:
vlanid = l2network_models.VlanID(start) vlanid = l2network_models.VlanID(start)
session.add(vlanid) session.add(vlanid)

View File

@ -22,9 +22,9 @@ from quantum.common import exceptions as q_exc
from quantum.db import api as db from quantum.db import api as db
from quantum.openstack.common import log as logging from quantum.openstack.common import log as logging
from quantum.plugins.cisco.common import cisco_exceptions as c_exc from quantum.plugins.cisco.common import cisco_exceptions as c_exc
from quantum.plugins.cisco.common import config
from quantum.plugins.cisco.db import network_models_v2 from quantum.plugins.cisco.db import network_models_v2
from quantum.plugins.cisco.db import nexus_models_v2 from quantum.plugins.cisco.db import nexus_models_v2
from quantum.plugins.cisco import l2network_plugin_configuration as conf
from quantum.plugins.openvswitch import ovs_models_v2 from quantum.plugins.openvswitch import ovs_models_v2
@ -40,8 +40,8 @@ def create_vlanids():
except exc.MultipleResultsFound: except exc.MultipleResultsFound:
pass pass
except exc.NoResultFound: except exc.NoResultFound:
start = int(conf.VLAN_START) start = int(config.CISCO.vlan_start)
end = int(conf.VLAN_END) end = int(config.CISCO.vlan_end)
while start <= end: while start <= end:
vlanid = network_models_v2.VlanID(start) vlanid = network_models_v2.VlanID(start)
session.add(vlanid) session.add(vlanid)

View File

@ -1,67 +0,0 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2011 Cisco Systems, Inc. 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: Sumit Naiksatam, Cisco Systems, Inc.
# @author: Rohit Agarwalla, Cisco Systems, Inc.
from quantum.common.utils import find_config_file
from quantum.plugins.cisco.common import cisco_configparser as confp
CONF_FILE = find_config_file({'plugin': 'cisco'}, "l2network_plugin.ini")
CONF_PARSER_OBJ = confp.CiscoConfigParser(CONF_FILE)
# Read the conf for the l2network_plugin
SECTION_CONF = CONF_PARSER_OBJ['VLANS']
VLAN_NAME_PREFIX = SECTION_CONF['vlan_name_prefix']
VLAN_START = SECTION_CONF['vlan_start']
VLAN_END = SECTION_CONF['vlan_end']
SECTION_CONF = CONF_PARSER_OBJ['PORTS']
MAX_PORTS = SECTION_CONF['max_ports']
SECTION_CONF = CONF_PARSER_OBJ['NETWORKS']
MAX_NETWORKS = SECTION_CONF['max_networks']
SECTION_CONF = CONF_PARSER_OBJ['MODEL']
MODEL_CLASS = SECTION_CONF['model_class']
if 'TEST' in CONF_PARSER_OBJ.keys():
TEST = CONF_PARSER_OBJ['TEST']
CONF_FILE = find_config_file({'plugin': 'cisco'}, "cisco_plugins.ini")
SECTION_CONF = CONF_PARSER_OBJ['SEGMENTATION']
MANAGER_CLASS = SECTION_CONF['manager_class']
CONF_PARSER_OBJ = confp.CiscoConfigParser(CONF_FILE)
# Read the config for the device plugins
PLUGINS = CONF_PARSER_OBJ.walk(CONF_PARSER_OBJ.dummy)
CONF_FILE = find_config_file({'plugin': 'cisco'}, "db_conn.ini")
CONF_PARSER_OBJ = confp.CiscoConfigParser(CONF_FILE)
# Read DB config for the Quantum DB
SECTION_CONF = CONF_PARSER_OBJ['DATABASE']
DB_NAME = SECTION_CONF['name']
DB_USER = SECTION_CONF['user']
DB_PASS = SECTION_CONF['pass']
DB_HOST = SECTION_CONF['host']

View File

@ -23,8 +23,8 @@ from copy import deepcopy
import inspect import inspect
import logging import logging
from keystoneclient.v2_0 import client as keystone_client
from novaclient.v1_1 import client as nova_client from novaclient.v1_1 import client as nova_client
from oslo.config import cfg
from quantum.db import l3_db from quantum.db import l3_db
from quantum.manager import QuantumManager from quantum.manager import QuantumManager
@ -32,7 +32,7 @@ from quantum.openstack.common import importutils
from quantum.plugins.cisco.common import cisco_constants as const from quantum.plugins.cisco.common import cisco_constants as const
from quantum.plugins.cisco.common import cisco_credentials_v2 as cred from quantum.plugins.cisco.common import cisco_credentials_v2 as cred
from quantum.plugins.cisco.db import network_db_v2 as cdb from quantum.plugins.cisco.db import network_db_v2 as cdb
from quantum.plugins.cisco import l2network_plugin_configuration as conf from quantum.plugins.cisco.common import config as conf
from quantum.plugins.openvswitch import ovs_db_v2 as odb from quantum.plugins.openvswitch import ovs_db_v2 as odb
from quantum import quantum_plugin_base_v2 from quantum import quantum_plugin_base_v2
from quantum.db import api as db_api from quantum.db import api as db_api
@ -51,7 +51,6 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
__native_bulk_support = True __native_bulk_support = True
supported_extension_aliases = [] supported_extension_aliases = []
_plugins = {} _plugins = {}
_inventory = {}
_methods_to_delegate = ['create_network_bulk', _methods_to_delegate = ['create_network_bulk',
'get_network', 'get_networks', 'get_network', 'get_networks',
'create_port_bulk', 'create_port_bulk',
@ -66,16 +65,12 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
configured, and load the inventories those device plugins for which the configured, and load the inventories those device plugins for which the
inventory is configured inventory is configured
""" """
for key in conf.PLUGINS[const.PLUGINS].keys(): conf.CiscoConfigOptions()
plugin_obj = conf.PLUGINS[const.PLUGINS][key]
for key in conf.CISCO_PLUGINS.keys():
plugin_obj = conf.CISCO_PLUGINS[key]
self._plugins[key] = importutils.import_object(plugin_obj) self._plugins[key] = importutils.import_object(plugin_obj)
LOG.debug(_("Loaded device plugin %s\n"), LOG.debug(_("Loaded device plugin %s\n"), conf.CISCO_PLUGINS[key])
conf.PLUGINS[const.PLUGINS][key])
if key in conf.PLUGINS[const.INVENTORY].keys():
inventory_obj = conf.PLUGINS[const.INVENTORY][key]
self._inventory[key] = importutils.import_object(inventory_obj)
LOG.debug(_("Loaded device inventory %s\n"),
conf.PLUGINS[const.INVENTORY][key])
if ((const.VSWITCH_PLUGIN in self._plugins) and if ((const.VSWITCH_PLUGIN in self._plugins) and
hasattr(self._plugins[const.VSWITCH_PLUGIN], hasattr(self._plugins[const.VSWITCH_PLUGIN],
@ -126,41 +121,18 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
def _invoke_plugin_per_device(self, plugin_key, function_name, args): def _invoke_plugin_per_device(self, plugin_key, function_name, args):
""" """
Invokes a device plugin's relevant functions (on the it's Invokes a device plugin's relevant functions (based on the
inventory and plugin implementation) for completing this operation. plugin implementation) for completing this operation.
""" """
if plugin_key not in self._plugins: if plugin_key not in self._plugins:
LOG.info(_("No %s Plugin loaded"), plugin_key) LOG.info(_("No %s Plugin loaded"), plugin_key)
LOG.info(_("%(plugin_key)s: %(function_name)s with args %(args)s " LOG.info(_("%(plugin_key)s: %(function_name)s with args %(args)s "
"ignored"), locals()) "ignored"), locals())
return return
device_params = self._invoke_inventory(plugin_key, function_name,
args) device_params = {const.DEVICE_IP: []}
device_ips = device_params[const.DEVICE_IP]
if not device_ips:
return [self._invoke_plugin(plugin_key, function_name, args, return [self._invoke_plugin(plugin_key, function_name, args,
device_params)] device_params)]
else:
output = []
for device_ip in device_ips:
new_device_params = deepcopy(device_params)
new_device_params[const.DEVICE_IP] = device_ip
output.append(self._invoke_plugin(plugin_key, function_name,
args, new_device_params))
return output
def _invoke_inventory(self, plugin_key, function_name, args):
"""
Invokes the relevant function on a device plugin's
inventory for completing this operation.
"""
if plugin_key not in self._inventory:
LOG.info(_("No %s inventory loaded"), plugin_key)
LOG.info(_("%(plugin_key)s: %(function_name)s with args %(args)s "
"ignored"), locals())
return {const.DEVICE_IP: []}
else:
return getattr(self._inventory[plugin_key], function_name)(args)
def _invoke_plugin(self, plugin_key, function_name, args, kwargs): def _invoke_plugin(self, plugin_key, function_name, args, kwargs):
""" """
@ -202,18 +174,14 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
return False return False
def _get_instance_host(self, tenant_id, instance_id): def _get_instance_host(self, tenant_id, instance_id):
keystone = cred._creds_dictionary['keystone'] keystone_conf = cfg.CONF.keystone_authtoken
kc = keystone_client.Client(username=keystone['username'], keystone_auth_url = '%s://%s:%s/v2.0/' % (keystone_conf.auth_protocol,
password=keystone['password'], keystone_conf.auth_host,
tenant_id=tenant_id, keystone_conf.auth_port)
auth_url=keystone['auth_url']) nc = nova_client.Client(keystone_conf.admin_user,
tenant = kc.tenants.get(tenant_id) keystone_conf.admin_password,
tenant_name = tenant.name keystone_conf.admin_tenant_name,
keystone_auth_url,
nc = nova_client.Client(keystone['username'],
keystone['password'],
tenant_name,
keystone['auth_url'],
no_cache=True) no_cache=True)
serv = nc.servers.get(instance_id) serv = nc.servers.get(instance_id)
host = serv.__getattr__('OS-EXT-SRV-ATTR:host') host = serv.__getattr__('OS-EXT-SRV-ATTR:host')
@ -234,7 +202,7 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
vlan_id = self._get_segmentation_id(ovs_output[0]['id']) vlan_id = self._get_segmentation_id(ovs_output[0]['id'])
if not self._validate_vlan_id(vlan_id): if not self._validate_vlan_id(vlan_id):
return ovs_output[0] return ovs_output[0]
vlan_name = conf.VLAN_NAME_PREFIX + str(vlan_id) vlan_name = conf.CISCO.vlan_name_prefix + str(vlan_id)
vlanids = self._get_all_segmentation_ids() vlanids = self._get_all_segmentation_ids()
args = [ovs_output[0]['tenant_id'], ovs_output[0]['name'], args = [ovs_output[0]['tenant_id'], ovs_output[0]['name'],
ovs_output[0]['id'], vlan_name, vlan_id, ovs_output[0]['id'], vlan_name, vlan_id,
@ -307,7 +275,7 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
host = self._get_instance_host(tenant_id, instance_id) host = self._get_instance_host(tenant_id, instance_id)
# Trunk segmentation id for only this host # Trunk segmentation id for only this host
vlan_name = conf.VLAN_NAME_PREFIX + str(vlan_id) vlan_name = conf.CISCO.vlan_name_prefix + str(vlan_id)
n_args = [tenant_id, net_name, net_id, n_args = [tenant_id, net_name, net_id,
vlan_name, vlan_id, host, instance_id] vlan_name, vlan_id, host, instance_id]
nexus_output = self._invoke_plugin_per_device( nexus_output = self._invoke_plugin_per_device(
@ -332,8 +300,8 @@ class VirtualPhysicalSwitchModelV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
instance_id = port['port']['device_id'] instance_id = port['port']['device_id']
device_owner = port['port']['device_owner'] device_owner = port['port']['device_owner']
if hasattr(conf, 'TEST'): if conf.CISCO_TEST.host is not None:
host = conf.TEST['host'] host = conf.CISCO_TEST.host
elif device_owner == 'network:dhcp': elif device_owner == 'network:dhcp':
return ovs_output[0] return ovs_output[0]
elif instance_id: elif instance_id:

View File

@ -28,8 +28,8 @@ from quantum.openstack.common import importutils
from quantum.plugins.cisco.common import cisco_constants as const from quantum.plugins.cisco.common import cisco_constants as const
from quantum.plugins.cisco.common import cisco_exceptions as cexc from quantum.plugins.cisco.common import cisco_exceptions as cexc
from quantum.plugins.cisco.common import cisco_utils as cutil from quantum.plugins.cisco.common import cisco_utils as cutil
from quantum.plugins.cisco.common import config
from quantum.plugins.cisco.db import network_db_v2 as cdb from quantum.plugins.cisco.db import network_db_v2 as cdb
from quantum.plugins.cisco import l2network_plugin_configuration as conf
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -53,10 +53,10 @@ class PluginV2(db_base_plugin_v2.QuantumDbPluginV2):
""" """
Loads the model class. Loads the model class.
""" """
self._model = importutils.import_object(conf.MODEL_CLASS) self._model = importutils.import_object(config.CISCO.model_class)
if hasattr(self._model, "MANAGE_STATE") and self._model.MANAGE_STATE: if hasattr(self._model, "MANAGE_STATE") and self._model.MANAGE_STATE:
self._master = False self._master = False
LOG.debug(_("Model %s manages state"), conf.MODEL_CLASS) LOG.debug(_("Model %s manages state"), config.CISCO.model_class)
native_bulk_attr_name = ("_%s__native_bulk_support" native_bulk_attr_name = ("_%s__native_bulk_support"
% self._model.__class__.__name__) % self._model.__class__.__name__)
self.__native_bulk_support = getattr(self._model, self.__native_bulk_support = getattr(self._model,

View File

@ -1,36 +0,0 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2011 Cisco Systems, Inc. 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: Sumit Naiksatam, Cisco Systems, Inc.
# @author: Edgar Magana, Cisco Systems, Inc.
#
"""
Configuration consolidation for the Nexus Driver
This module will export the configuration parameters
from the nexus.ini file
"""
from quantum.common.utils import find_config_file
from quantum.plugins.cisco.common import cisco_configparser as confp
CP = confp.CiscoConfigParser(find_config_file({'plugin': 'cisco'},
"nexus.ini"))
NEXUS_DETAILS = CP['SWITCH']
SECTION = CP['DRIVER']
NEXUS_DRIVER = SECTION['name']

View File

@ -31,10 +31,10 @@ from quantum.openstack.common import importutils
from quantum.plugins.cisco.common import cisco_constants as const from quantum.plugins.cisco.common import cisco_constants as const
from quantum.plugins.cisco.common import cisco_credentials_v2 as cred from quantum.plugins.cisco.common import cisco_credentials_v2 as cred
from quantum.plugins.cisco.common import cisco_exceptions as excep from quantum.plugins.cisco.common import cisco_exceptions as excep
from quantum.plugins.cisco.common import config as conf
from quantum.plugins.cisco.db import network_db_v2 as cdb from quantum.plugins.cisco.db import network_db_v2 as cdb
from quantum.plugins.cisco.db import nexus_db_v2 as nxos_db from quantum.plugins.cisco.db import nexus_db_v2 as nxos_db
from quantum.plugins.cisco.l2device_plugin_base import L2DevicePluginBase from quantum.plugins.cisco.l2device_plugin_base import L2DevicePluginBase
from quantum.plugins.cisco.nexus import cisco_nexus_configuration as conf
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -50,9 +50,9 @@ class NexusPlugin(L2DevicePluginBase):
""" """
Extracts the configuration parameters from the configuration file Extracts the configuration parameters from the configuration file
""" """
self._client = importutils.import_object(conf.NEXUS_DRIVER) self._client = importutils.import_object(conf.CISCO.nexus_driver)
LOG.debug(_("Loaded driver %s"), conf.NEXUS_DRIVER) LOG.debug(_("Loaded driver %s"), conf.CISCO.nexus_driver)
self._nexus_switches = conf.NEXUS_DETAILS self._nexus_switches = conf.get_nexus_dictionary()
self.credentials = {} self.credentials = {}
def get_credential(self, nexus_ip): def get_credential(self, nexus_ip):
@ -85,11 +85,11 @@ class NexusPlugin(L2DevicePluginBase):
# Grab the switch IP and port for this host # Grab the switch IP and port for this host
switch_ip = '' switch_ip = ''
port_id = '' port_id = ''
for switch in self._nexus_switches.keys(): for keys in self._nexus_switches.keys():
for hostname in self._nexus_switches[switch].keys(): if str(keys[1]) == str(host):
if str(hostname) == str(host): switch_ip = keys[0]
switch_ip = switch port_id = self._nexus_switches[keys[0], keys[1]]
port_id = self._nexus_switches[switch][hostname]['ports']
# Check if this network is already in the DB # Check if this network is already in the DB
binding = nxos_db.get_port_vlan_switch_binding( binding = nxos_db.get_port_vlan_switch_binding(
port_id, vlan_id, switch_ip) port_id, vlan_id, switch_ip)
@ -97,7 +97,7 @@ class NexusPlugin(L2DevicePluginBase):
_nexus_ip = switch_ip _nexus_ip = switch_ip
_nexus_ports = (port_id,) _nexus_ports = (port_id,)
_nexus_ssh_port = \ _nexus_ssh_port = \
self._nexus_switches[switch_ip]['ssh_port']['ssh_port'] self._nexus_switches[switch_ip, 'ssh_port']
_nexus_creds = self.get_credential(_nexus_ip) _nexus_creds = self.get_credential(_nexus_ip)
_nexus_username = _nexus_creds['username'] _nexus_username = _nexus_creds['username']
_nexus_password = _nexus_creds['password'] _nexus_password = _nexus_creds['password']
@ -187,7 +187,7 @@ class NexusPlugin(L2DevicePluginBase):
_nexus_ip = row['switch_ip'] _nexus_ip = row['switch_ip']
_nexus_ports = (row['port_id'],) _nexus_ports = (row['port_id'],)
_nexus_ssh_port = \ _nexus_ssh_port = \
self._nexus_switches[_nexus_ip]['ssh_port']['ssh_port'] self._nexus_switches[_nexus_ip, 'ssh_port']
_nexus_creds = self.get_credential(_nexus_ip) _nexus_creds = self.get_credential(_nexus_ip)
_nexus_username = _nexus_creds['username'] _nexus_username = _nexus_creds['username']
_nexus_password = _nexus_creds['password'] _nexus_password = _nexus_creds['password']

View File

@ -51,14 +51,8 @@ class TestCiscoNexusPlugin(base.BaseTestCase):
self.second_vlan_name = "q-" + str(self.second_net_id) + "vlan" self.second_vlan_name = "q-" + str(self.second_net_id) + "vlan"
self.second_vlan_id = 265 self.second_vlan_id = 265
self._nexus_switches = { self._nexus_switches = {
NEXUS_IP_ADDRESS: { (NEXUS_IP_ADDRESS, HOSTNAME): NEXUS_PORTS,
HOSTNAME: { (NEXUS_IP_ADDRESS, 'ssh_port'): NEXUS_SSH_PORT,
'ports': NEXUS_PORTS,
},
'ssh_port': {
'ssh_port': NEXUS_SSH_PORT
}
}
} }
self._hostname = HOSTNAME self._hostname = HOSTNAME

View File

@ -92,11 +92,7 @@ else:
(ovs_plugin_config_path, (ovs_plugin_config_path,
['etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini']), ['etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini']),
(cisco_plugin_config_path, (cisco_plugin_config_path,
['etc/quantum/plugins/cisco/credentials.ini', ['etc/quantum/plugins/cisco/cisco_plugins.ini']),
'etc/quantum/plugins/cisco/l2network_plugin.ini',
'etc/quantum/plugins/cisco/nexus.ini',
'etc/quantum/plugins/cisco/cisco_plugins.ini',
'etc/quantum/plugins/cisco/db_conn.ini']),
(bigswitch_plugin_config_path, (bigswitch_plugin_config_path,
['etc/quantum/plugins/bigswitch/restproxy.ini']), ['etc/quantum/plugins/bigswitch/restproxy.ini']),
(brocade_plugin_config_path, (brocade_plugin_config_path,