summaryrefslogtreecommitdiffstats
path: root/nova/network
diff options
context:
space:
mode:
Diffstat (limited to 'nova/network')
-rw-r--r--nova/network/linux_net.py12
-rw-r--r--nova/network/model.py3
-rw-r--r--nova/network/quantumv2/__init__.py59
-rw-r--r--nova/network/quantumv2/api.py8
-rw-r--r--nova/network/security_group/quantum_driver.py49
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"),