diff options
Diffstat (limited to 'nova/network')
-rw-r--r-- | nova/network/linux_net.py | 12 | ||||
-rw-r--r-- | nova/network/model.py | 3 | ||||
-rw-r--r-- | nova/network/quantumv2/__init__.py | 59 | ||||
-rw-r--r-- | nova/network/quantumv2/api.py | 8 | ||||
-rw-r--r-- | nova/network/security_group/quantum_driver.py | 49 |
5 files changed, 69 insertions, 62 deletions
diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py index 15be3d3c4..db008cc93 100644 --- a/nova/network/linux_net.py +++ b/nova/network/linux_net.py @@ -1260,6 +1260,18 @@ def delete_ovs_vif_port(bridge, dev): delete_net_dev(dev) +def create_ivs_vif_port(dev, iface_id, mac, instance_id): + utils.execute('ivs-ctl', 'add-port', + dev, run_as_root=True) + + +def delete_ivs_vif_port(dev): + utils.execute('ivs-ctl', 'del-port', dev, + run_as_root=True) + utils.execute('ip', 'link', 'delete', dev, + run_as_root=True) + + def create_tap_dev(dev, mac_address=None): if not device_exists(dev): try: diff --git a/nova/network/model.py b/nova/network/model.py index 240911ea9..ce8aa123b 100644 --- a/nova/network/model.py +++ b/nova/network/model.py @@ -30,6 +30,7 @@ def ensure_string_keys(d): # Constants for the 'vif_type' field in VIF class VIF_TYPE_OVS = 'ovs' +VIF_TYPE_IVS = 'ivs' VIF_TYPE_BRIDGE = 'bridge' VIF_TYPE_802_QBG = '802.1qbg' VIF_TYPE_802_QBH = '802.1qbh' @@ -72,7 +73,7 @@ class IP(Model): if self['address'] and not self['version']: try: self['version'] = netaddr.IPAddress(self['address']).version - except netaddr.AddrFormatError as e: + except netaddr.AddrFormatError: raise exception.InvalidIpAddressError(self['address']) def __eq__(self, other): diff --git a/nova/network/quantumv2/__init__.py b/nova/network/quantumv2/__init__.py index 89c08311f..6d6e7c7bc 100644 --- a/nova/network/quantumv2/__init__.py +++ b/nova/network/quantumv2/__init__.py @@ -16,7 +16,9 @@ # under the License. from oslo.config import cfg -from quantumclient.v2_0 import client +from quantumclient import client +from quantumclient.common import exceptions +from quantumclient.v2_0 import client as clientv20 from nova.openstack.common import excutils from nova.openstack.common import log as logging @@ -25,24 +27,27 @@ CONF = cfg.CONF LOG = logging.getLogger(__name__) -cached_admin_client = None - - -def _fill_admin_details(params): - params['username'] = CONF.quantum_admin_username - params['tenant_name'] = CONF.quantum_admin_tenant_name - params['region_name'] = CONF.quantum_region_name - params['password'] = CONF.quantum_admin_password - params['auth_url'] = CONF.quantum_admin_auth_url - params['timeout'] = CONF.quantum_url_timeout - params['auth_strategy'] = CONF.quantum_auth_strategy - params['insecure'] = CONF.quantum_api_insecure +def _get_auth_token(): + try: + httpclient = client.HTTPClient( + username=CONF.quantum_admin_username, + tenant_name=CONF.quantum_admin_tenant_name, + region_name=CONF.quantum_region_name, + password=CONF.quantum_admin_password, + auth_url=CONF.quantum_admin_auth_url, + timeout=CONF.quantum_url_timeout, + auth_strategy=CONF.quantum_auth_strategy, + insecure=CONF.quantum_api_insecure) + httpclient.authenticate() + return httpclient.auth_token + except exceptions.QuantumClientException as e: + with excutils.save_and_reraise_exception(): + LOG.error(_('Quantum client authentication failed: %s'), e) def _get_client(token=None): - global cached_admin_client - - should_cache = False + if not token and CONF.quantum_auth_strategy: + token = _get_auth_token() params = { 'endpoint_url': CONF.quantum_url, 'timeout': CONF.quantum_url_timeout, @@ -51,30 +56,12 @@ def _get_client(token=None): if token: params['token'] = token else: - if CONF.quantum_auth_strategy: - should_cache = True - _fill_admin_details(params) - else: - params['auth_strategy'] = None - - new_client = client.Client(**params) - if should_cache: - # in this case, we don't have the token yet - try: - new_client.httpclient.authenticate() - except Exception: - with excutils.save_and_reraise_exception(): - LOG.exception(_("quantum authentication failed")) - - cached_admin_client = new_client - return new_client + params['auth_strategy'] = None + return clientv20.Client(**params) def get_client(context, admin=False): if admin: - if cached_admin_client is not None: - return cached_admin_client - token = None else: token = context.auth_token diff --git a/nova/network/quantumv2/api.py b/nova/network/quantumv2/api.py index 054611cd3..c7f4ffd58 100644 --- a/nova/network/quantumv2/api.py +++ b/nova/network/quantumv2/api.py @@ -33,8 +33,6 @@ from nova.openstack.common import excutils from nova.openstack.common import log as logging from nova.openstack.common import uuidutils -import quantumclient.common.exceptions - quantum_opts = [ cfg.StrOpt('quantum_url', default='http://127.0.0.1:9696', @@ -325,7 +323,7 @@ class API(base.Base): for port in ports: try: quantumv2.get_client(context).delete_port(port['id']) - except Exception as ex: + except Exception: LOG.exception(_("Failed to delete quantum port %(portid)s ") % {'portid': port['id']}) @@ -540,7 +538,7 @@ class API(base.Base): def get_all(self, context): """Get all networks for client.""" client = quantumv2.get_client(context) - networks = client.list_networks().get('networks') or {} + networks = client.list_networks().get('networks') for network in networks: network['label'] = network['name'] return networks @@ -723,7 +721,7 @@ class API(base.Base): port_id=port) # If a quantum plugin does not implement the L3 API a 404 from # list_floatingips will be raised. - except quantumclient.common.exceptions.QuantumClientException as e: + except quantumv2.exceptions.QuantumClientException as e: if e.status_code == 404: return [] raise diff --git a/nova/network/security_group/quantum_driver.py b/nova/network/security_group/quantum_driver.py index 7709da970..6e62d796d 100644 --- a/nova/network/security_group/quantum_driver.py +++ b/nova/network/security_group/quantum_driver.py @@ -17,6 +17,8 @@ # # @author: Aaron Rosen, Nicira Networks, Inc. +import sys + from oslo.config import cfg from quantumclient.common import exceptions as q_exc from quantumclient.quantum import v2_0 as quantumv20 @@ -50,6 +52,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): security_group = quantum.create_security_group( body).get('security_group') except q_exc.QuantumClientException as e: + exc_info = sys.exc_info() LOG.exception(_("Quantum Error creating security group %s"), name) if e.status_code == 401: @@ -57,7 +60,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): # as this error code could be related to bad input or over # quota raise exc.HTTPBadRequest() - raise e + raise exc_info[0], exc_info[1], exc_info[2] return self._convert_to_nova_security_group_format(security_group) def update_security_group(self, context, security_group, @@ -68,6 +71,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): security_group = quantum.update_security_group( security_group['id'], body).get('security_group') except q_exc.QuantumClientException as e: + exc_info = sys.exc_info() LOG.exception(_("Quantum Error updating security group %s"), name) if e.status_code == 401: @@ -75,7 +79,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): # as this error code could be related to bad input or over # quota raise exc.HTTPBadRequest() - raise e + raise exc_info[0], exc_info[1], exc_info[2] return self._convert_to_nova_security_group_format(security_group) def _convert_to_nova_security_group_format(self, security_group): @@ -120,12 +124,13 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): quantum, 'security_group', name) group = quantum.show_security_group(id).get('security_group') except q_exc.QuantumClientException as e: + exc_info = sys.exc_info() if e.status_code == 404: LOG.debug(_("Quantum security group %s not found"), name) self.raise_not_found(e.message) else: LOG.error(_("Quantum Error: %s"), e) - raise e + raise exc_info[0], exc_info[1], exc_info[2] return self._convert_to_nova_security_group_format(group) @@ -143,9 +148,9 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): try: security_groups = quantum.list_security_groups(**search_opts).get( 'security_groups') - except q_exc.QuantumClientException as e: - LOG.exception(_("Quantum Error getting security groups")) - raise e + except q_exc.QuantumClientException: + with excutils.save_and_reraise_exception(): + LOG.exception(_("Quantum Error getting security groups")) converted_rules = [] for security_group in security_groups: converted_rules.append( @@ -165,13 +170,14 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): try: quantum.delete_security_group(security_group['id']) except q_exc.QuantumClientException as e: + exc_info = sys.exc_info() if e.status_code == 404: self.raise_not_found(e.message) elif e.status_code == 409: self.raise_invalid_property(e.message) else: LOG.error(_("Quantum Error: %s"), e) - raise e + raise exc_info[0], exc_info[1], exc_info[2] def add_rules(self, context, id, name, vals): """Add security group rule(s) to security group. @@ -188,13 +194,14 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): rules = quantum.create_security_group_rule( body).get('security_group_rules') except q_exc.QuantumClientException as e: + exc_info = sys.exc_info() if e.status_code == 409: LOG.exception(_("Quantum Error getting security group %s"), name) self.raise_not_found(e.message) else: LOG.exception(_("Quantum Error:")) - raise e + raise exc_info[0], exc_info[1], exc_info[2] converted_rules = [] for rule in rules: converted_rules.append( @@ -246,9 +253,8 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): for rule_id in range(0, len(rule_ids)): quantum.delete_security_group_rule(rule_ids.pop()) except q_exc.QuantumClientException as e: - LOG.exception(_("Quantum Error unable to delete %s"), - rule_ids) - raise e + with excutils.save_and_reraise_exception(): + LOG.exception(_("Quantum Error unable to delete %s"), rule_ids) def get_rule(self, context, id): quantum = quantumv2.get_client(context) @@ -256,12 +262,13 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): rule = quantum.show_security_group_rule( id).get('security_group_rule') except q_exc.QuantumClientException as e: + exc_info = sys.exc_info() if e.status_code == 404: LOG.debug(_("Quantum security group rule %s not found"), id) self.raise_not_found(e.message) else: LOG.error(_("Quantum Error: %s"), e) - raise e + raise exc_info[0], exc_info[1], exc_info[2] return self._convert_to_nova_security_group_rule_format(rule) def get_instances_security_groups_bindings(self, context): @@ -350,19 +357,20 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): security_group_id = quantumv20.find_resourceid_by_name_or_id( quantum, 'security_group', security_group_name) except q_exc.QuantumClientException as e: + exc_info = sys.exc_info() if e.status_code == 404: msg = ("Security group %s is not found for project %s" % (security_group_name, context.project_id)) self.raise_not_found(msg) else: LOG.exception(_("Quantum Error:")) - raise e + raise exc_info[0], exc_info[1], exc_info[2] params = {'device_id': instance['uuid']} try: ports = quantum.list_ports(**params).get('ports') - except q_exc.QuantumClientException as e: + except q_exc.QuantumClientException: + with excutils.save_and_reraise_exception(): LOG.exception(_("Quantum Error:")) - raise e if not ports: msg = ("instance_id %s could not be found as device id on" @@ -398,19 +406,20 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): security_group_id = quantumv20.find_resourceid_by_name_or_id( quantum, 'security_group', security_group_name) except q_exc.QuantumClientException as e: + exc_info = sys.exc_info() if e.status_code == 404: msg = ("Security group %s is not found for project %s" % (security_group_name, context.project_id)) self.raise_not_found(msg) else: LOG.exception(_("Quantum Error:")) - raise e + raise exc_info[0], exc_info[1], exc_info[2] params = {'device_id': instance['uuid']} try: ports = quantum.list_ports(**params).get('ports') - except q_exc.QuantumClientException as e: + except q_exc.QuantumClientException: + with excutils.save_and_reraise_exception(): LOG.exception(_("Quantum Error:")) - raise e if not ports: msg = ("instance_id %s could not be found as device id on" @@ -438,8 +447,8 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): quantum.update_port(port['id'], {'port': updated_port}) found_security_group = True except Exception: - LOG.exception(_("Quantum Error:")) - raise e + with excutils.save_and_reraise_exception(): + LOG.exception(_("Quantum Error:")) if not found_security_group: msg = (_("Security group %(security_group_name)s not assocaited " "with the instance %(instance)s"), |