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:
parent
0deaadd145
commit
f164a60f15
@ -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
|
||||||
|
@ -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>
|
|
@ -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>
|
|
@ -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
|
|
@ -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
|
|
@ -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]
|
|
@ -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,16 +39,17 @@ class Store(object):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def initialize():
|
def initialize():
|
||||||
for id in _creds_dictionary.keys():
|
for keys in _nexus_dict.keys():
|
||||||
try:
|
if keys[1] == const.USERNAME:
|
||||||
cdb.add_credential(TENANT, id,
|
try:
|
||||||
_creds_dictionary[id][const.USERNAME],
|
cdb.add_credential(TENANT, keys[0],
|
||||||
_creds_dictionary[id][const.PASSWORD])
|
_nexus_dict[keys[0], const.USERNAME],
|
||||||
except cexc.CredentialAlreadyExists:
|
_nexus_dict[keys[0], const.PASSWORD])
|
||||||
# We are quietly ignoring this, since it only happens
|
except cexc.CredentialAlreadyExists:
|
||||||
# if this class module is loaded more than once, in which
|
# We are quietly ignoring this, since it only happens
|
||||||
# case, the credentials are already populated
|
# if this class module is loaded more than once, in which
|
||||||
pass
|
# case, the credentials are already populated
|
||||||
|
pass
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def put_credential(cred_name, username, password):
|
def put_credential(cred_name, username, password):
|
||||||
|
108
quantum/plugins/cisco/common/config.py
Normal file
108
quantum/plugins/cisco/common/config.py
Normal 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
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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']
|
|
@ -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_ips = device_params[const.DEVICE_IP]
|
|
||||||
if not device_ips:
|
|
||||||
return [self._invoke_plugin(plugin_key, function_name, args,
|
|
||||||
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):
|
device_params = {const.DEVICE_IP: []}
|
||||||
"""
|
return [self._invoke_plugin(plugin_key, function_name, args,
|
||||||
Invokes the relevant function on a device plugin's
|
device_params)]
|
||||||
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:
|
||||||
|
@ -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,
|
||||||
|
@ -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']
|
|
@ -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']
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
6
setup.py
6
setup.py
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user