Skip to content

Commit

Permalink
Support the neutron lib decomposition (step 2)
Browse files Browse the repository at this point in the history
From recent neutron release (since newton), a reusable library code for
neutron names 'neutron-lib' was introduced to stabalize some of the
common interfaces. That patch permits to support that new library.

Change-Id: I246bd902136d99a8e2ec97637690cae38310a2ef
Closes-Bug: #1650339
  • Loading branch information
Édouard Thuleau committed Jan 5, 2017
1 parent f499300 commit 19ad4bc
Show file tree
Hide file tree
Showing 27 changed files with 305 additions and 171 deletions.
6 changes: 3 additions & 3 deletions neutron_plugin_contrail/extensions/contrail.py
@@ -1,7 +1,7 @@
try:
from neutron_lib.api import extensions
from neutron.api.extensions import ExtensionDescriptor
except ImportError:
from neutron.api import extensions
from neutron_lib.api.extensions import ExtensionDescriptor


EXTENDED_ATTRIBUTES_2_0 = {
Expand Down Expand Up @@ -46,7 +46,7 @@
}


class Contrail(extensions.ExtensionDescriptor):
class Contrail(ExtensionDescriptor):

@classmethod
def get_name(cls):
Expand Down
26 changes: 13 additions & 13 deletions neutron_plugin_contrail/extensions/ipam.py
@@ -1,18 +1,19 @@
from abc import abstractmethod

try:
from neutron_lib import constants
except ImportError:
from neutron.api.v2 import attributes as constants
from neutron.api.v2.attributes import UUID_PATTERN
except:
from neutron_lib.constants import UUID_PATTERN
from neutron.api.v2 import base
try:
from neutron_lib import exceptions as exc
from neutron.common.exceptions import NotFound
except ImportError:
from neutron.common import exceptions as exc
from neutron_lib.exceptions import NotFound
try:
from neutron_lib.api import extensions
from neutron.api.extensions import ExtensionDescriptor
except ImportError:
from neutron.api import extensions
from neutron_lib.api.extensions import ExtensionDescriptor
from neutron.api.extensions import ResourceExtension
from neutron import manager

try:
Expand All @@ -22,14 +23,14 @@


# Ipam Exceptions
class IpamNotFound(exc.NotFound):
class IpamNotFound(NotFound):
message = _("IPAM %(id)s could not be found")

# Attribute Map
RESOURCE_ATTRIBUTE_MAP = {
'ipams': {
'id': {'allow_post': False, 'allow_put': False,
'validate': {'type:regex': constants.UUID_PATTERN},
'validate': {'type:regex': UUID_PATTERN},
'is_visible': True},
'name': {'allow_post': True, 'allow_put': False,
'is_visible': True, 'default': ''},
Expand All @@ -46,7 +47,7 @@ class IpamNotFound(exc.NotFound):
}


class Ipam(extensions.ExtensionDescriptor):
class Ipam(ExtensionDescriptor):

@classmethod
def get_name(cls):
Expand Down Expand Up @@ -85,9 +86,8 @@ def get_resources(cls):
plugin, params,
member_actions=member_actions)

ex = extensions.ResourceExtension(collection_name,
controller,
member_actions=member_actions)
ex = ResourceExtension(collection_name, controller,
member_actions=member_actions)
exts.append(ex)

return exts
Expand Down
24 changes: 11 additions & 13 deletions neutron_plugin_contrail/extensions/loadbalancercustomattributes.py
@@ -1,7 +1,7 @@
try:
from neutron_lib.api import extensions
from neutron.api.extensions import ExtensionDescriptor
except ImportError:
from neutron.api import extensions
from neutron_lib.api.extensions import ExtensionDescriptor

def _validate_custom_attributes(data, valid_values=None):
if not isinstance(data, list):
Expand All @@ -12,20 +12,18 @@ def convert_none_to_empty_list(value):
return [] if value is None else value

try:
from neutron_lib import constants
ATTR_NOT_SPECIFIED = constants.ATTR_NOT_SPECIFIED
except ImportError:
from neutron.api.v2 import attributes
ATTR_NOT_SPECIFIED = attributes.ATTR_NOT_SPECIFIED
from neutron.api.v2.attributes import ATTR_NOT_SPECIFIED
except:
from neutron_lib.constants import ATTR_NOT_SPECIFIED

try:
from neutron.api.v2 import attributes as attrs
if hasattr(attrs, 'validators'):
attrs.validators['type:customattributes'] = _validate_custom_attributes
else:
from neutron_lib.api import validators
from neutron.api.v2 import attributes as attr
validators.add_validator('type:customattributes',
_validate_custom_attributes)
except ImportError:
from neutron.api.v2 import attributes as attr
attr.validators['type:customattributes'] = _validate_custom_attributes


# Extended_Attribute MAP
EXTENDED_ATTRIBUTES_2_0 = {
Expand All @@ -39,7 +37,7 @@ def convert_none_to_empty_list(value):
}


class Loadbalancercustomattributes(extensions.ExtensionDescriptor):
class Loadbalancercustomattributes(ExtensionDescriptor):

@classmethod
def get_name(cls):
Expand Down
26 changes: 13 additions & 13 deletions neutron_plugin_contrail/extensions/policy.py
@@ -1,18 +1,19 @@
from abc import abstractmethod

try:
from neutron_lib import constants
except ImportError:
from neutron.api.v2 import attributes as constants
from neutron.api.v2.attributes import UUID_PATTERN
except:
from neutron_lib.constants import UUID_PATTERN
from neutron.api.v2 import base
try:
from neutron_lib import exceptions as exc
from neutron.common.exceptions import NotFound
except ImportError:
from neutron.common import exceptions as exc
from neutron_lib.exceptions import NotFound
try:
from neutron_lib.api import extensions
from neutron.api.extensions import ExtensionDescriptor
except ImportError:
from neutron.api import extensions
from neutron_lib.api.extensions import ExtensionDescriptor
from neutron.api.extensions import ResourceExtension
from neutron import manager

try:
Expand All @@ -22,14 +23,14 @@


# Policy Exceptions
class PolicyNotFound(exc.NotFound):
class PolicyNotFound(NotFound):
message = _("Policy %(id)s could not be found")

# Attribute Map
RESOURCE_ATTRIBUTE_MAP = {
'policys': {
'id': {'allow_post': False, 'allow_put': False,
'validate': {'type:regex': constants.UUID_PATTERN},
'validate': {'type:regex': UUID_PATTERN},
'is_visible': True},
'name': {'allow_post': True, 'allow_put': False,
'is_visible': True, 'default': ''},
Expand All @@ -46,7 +47,7 @@ class PolicyNotFound(exc.NotFound):
}


class Policy(extensions.ExtensionDescriptor):
class Policy(ExtensionDescriptor):

@classmethod
def get_name(cls):
Expand Down Expand Up @@ -84,9 +85,8 @@ def get_resources(cls):
plugin, params,
member_actions=member_actions)

ex = extensions.ResourceExtension(collection_name,
controller,
member_actions=member_actions)
ex = ResourceExtension(collection_name, controller,
member_actions=member_actions)
exts.append(ex)

return exts
Expand Down
15 changes: 7 additions & 8 deletions neutron_plugin_contrail/extensions/serviceinterface.py
@@ -1,24 +1,23 @@
#from neutron.api.v2 import attributes as attr
try:
from neutron_lib import constants
except ImportError:
from neutron.api.v2 import attributes as constants
from neutron.api.v2.attributes import ATTR_NOT_SPECIFIED
except:
from neutron_lib.constants import ATTR_NOT_SPECIFIED
try:
from neutron_lib.api import extensions
from neutron.api.extensions import ExtensionDescriptor
except ImportError:
from neutron.api import extensions
from neutron_lib.api.extensions import ExtensionDescriptor

EXTENDED_ATTRIBUTES_2_0 = {
'ports': {
'binding:service_interface_type': {'allow_post': True,
'allow_put': False,
'default': constants.ATTR_NOT_SPECIFIED,
'default': ATTR_NOT_SPECIFIED,
'is_visible': True},
},
}


class Serviceinterface(extensions.ExtensionDescriptor):
class Serviceinterface(ExtensionDescriptor):

@classmethod
def get_name(cls):
Expand Down
21 changes: 11 additions & 10 deletions neutron_plugin_contrail/extensions/vfbinding.py
Expand Up @@ -14,29 +14,30 @@
#

try:
from neutron_lib.api import converters
from neutron_lib import constants
ATTR_NOT_SPECIFIED = constants.ATTR_NOT_SPECIFIED
except ImportError:
from neutron.api.v2 import attributes as converters
ATTR_NOT_SPECIFIED = converters.ATTR_NOT_SPECIFIED
from neutron.api.v2.attributes import ATTR_NOT_SPECIFIED
except:
from neutron_lib.constants import ATTR_NOT_SPECIFIED
try:
from neutron.api.v2.attributes import convert_kvp_list_to_dict
except:
from neutron_lib.api.converters import convert_kvp_list_to_dict
try:
from neutron_lib.api import extensions
from neutron.api.extensions import ExtensionDescriptor
except ImportError:
from neutron.api import extensions
from neutron_lib.api.extensions import ExtensionDescriptor

EXTENDED_ATTRIBUTES_2_0 = {
'ports': {
'binding:vf': {'allow_post': True,
'allow_put': True,
'convert_list_to': converters.convert_kvp_list_to_dict,
'convert_list_to': convert_kvp_list_to_dict,
'default': ATTR_NOT_SPECIFIED,
'is_visible': True},
},
}


class Vfbinding(extensions.ExtensionDescriptor):
class Vfbinding(ExtensionDescriptor):

@classmethod
def get_name(cls):
Expand Down
18 changes: 9 additions & 9 deletions neutron_plugin_contrail/extensions/vpcroutetable.py
Expand Up @@ -24,15 +24,16 @@
from oslo_config import cfg

try:
from neutron_lib.api import extensions
from neutron.api.extensions import ExtensionDescriptor
except ImportError:
from neutron.api import extensions
from neutron_lib.api.extensions import ExtensionDescriptor
from neutron.api.extensions import ResourceExtension
from neutron.api.v2 import attributes as attr
from neutron.api.v2 import base
try:
from neutron_lib import exceptions as exc
from neutron.common.exceptions import NotFound
except ImportError:
from neutron.common import exceptions as exc
from neutron_lib.exceptions import NotFound
from neutron import manager
try:
from neutron.quota import resource_registry as quota
Expand All @@ -45,7 +46,7 @@
from oslo_utils import uuidutils

# Route table Exceptions
class RouteTableNotFound(exc.NotFound):
class RouteTableNotFound(NotFound):
message = _("Route table %(id)s does not exist")

# Attribute Map
Expand Down Expand Up @@ -102,7 +103,7 @@ class RouteTableNotFound(exc.NotFound):
}


class Vpcroutetable(extensions.ExtensionDescriptor):
class Vpcroutetable(ExtensionDescriptor):
""" Route table extension"""

@classmethod
Expand Down Expand Up @@ -143,9 +144,8 @@ def get_resources(cls):
allow_pagination=True,
allow_sorting=True)

ex = extensions.ResourceExtension(collection_name,
controller,
attr_map=params)
ex = ResourceExtension(collection_name, controller,
attr_map=params)
exts.append(ex)

return exts
Expand Down
23 changes: 15 additions & 8 deletions neutron_plugin_contrail/plugins/opencontrail/contrail_plugin.py
Expand Up @@ -15,11 +15,18 @@
# @author: Hampapur Ajay, Praneet Bachheti, Rudra Rugge, Atul Moghe
import requests

from neutron.api.v2 import attributes as attr
try:
from neutron_lib import exceptions as exc
from neutron.api.v2.attributes import ATTR_NOT_SPECIFIED
except:
from neutron_lib.constants import ATTR_NOT_SPECIFIED
try:
from neutron.common.exceptions import ServiceUnavailable
except ImportError:
from neutron_lib.exceptions import ServiceUnavailable
try:
from neutron.common.exceptions import BadRequest
except ImportError:
from neutron.common import exceptions as exc
from neutron_lib.exceptions import BadRequest
from neutron.common.config import cfg
from neutron.db import portbindings_base
from neutron.db import quota_db # noqa
Expand Down Expand Up @@ -74,7 +81,7 @@
help='Port to connect to VNC collector'),
]

class InvalidContrailExtensionError(exc.ServiceUnavailable):
class InvalidContrailExtensionError(ServiceUnavailable):
message = _("Invalid Contrail Extension: %(ext_name) %(ext_class)")

class NeutronPluginContrailCoreV2(plugin_base.NeutronPluginContrailCoreBase):
Expand Down Expand Up @@ -262,7 +269,7 @@ def _create_resource(self, res_type, context, res_data):
"""

for key, value in res_data[res_type].items():
if value == attr.ATTR_NOT_SPECIFIED:
if value == ATTR_NOT_SPECIFIED:
del res_data[res_type][key]

res_dict = self._encode_resource(resource=res_data[res_type])
Expand Down Expand Up @@ -350,12 +357,12 @@ def add_router_interface(self, context, router_id, interface_info):

if not interface_info:
msg = _("Either subnet_id or port_id must be specified")
raise exc.BadRequest(resource='router', msg=msg)
raise BadRequest(resource='router', msg=msg)

if 'port_id' in interface_info:
if 'subnet_id' in interface_info:
msg = _("Cannot specify both subnet-id and port-id")
raise exc.BadRequest(resource='router', msg=msg)
raise BadRequest(resource='router', msg=msg)

res_dict = self._encode_resource(resource_id=router_id,
resource=interface_info)
Expand All @@ -371,7 +378,7 @@ def remove_router_interface(self, context, router_id, interface_info):

if not interface_info:
msg = _("Either subnet_id or port_id must be specified")
raise exc.BadRequest(resource='router', msg=msg)
raise BadRequest(resource='router', msg=msg)

res_dict = self._encode_resource(resource_id=router_id,
resource=interface_info)
Expand Down

0 comments on commit 19ad4bc

Please sign in to comment.