-import os
-
-NSX_EXT_PATH = os.path.join(os.path.dirname(__file__), 'extensions')
+++ /dev/null
-# Copyright 2015 VMware, 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.
-
-from neutron.api import extensions
-
-# Attribute Map
-ADV_SERVICE_PROVIDERS = 'advanced_service_providers'
-
-
-EXTENDED_ATTRIBUTES_2_0 = {
- 'subnets': {
- ADV_SERVICE_PROVIDERS:
- {'allow_post': False,
- 'allow_put': False,
- 'is_visible': True,
- 'default': None}}}
-
-
-class Advancedserviceproviders(extensions.ExtensionDescriptor):
- @classmethod
- def get_name(cls):
- return "Advanced Service Providers"
-
- @classmethod
- def get_alias(cls):
- return "advanced-service-providers"
-
- @classmethod
- def get_description(cls):
- return "Id of the advanced service providers attached to the subnet"
-
- @classmethod
- def get_updated(cls):
- return "2014-12-11T12:00:00-00:00"
-
- def get_extended_resources(self, version):
- if version == "2.0":
- return EXTENDED_ATTRIBUTES_2_0
- else:
- return {}
+++ /dev/null
-# Copyright 2014 VMware, 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.
-#
-
-from neutron.api import extensions
-from neutron.api.v2 import base
-from neutron import manager
-
-
-EXT_ALIAS = 'lsn'
-COLLECTION_NAME = "%ss" % EXT_ALIAS
-
-RESOURCE_ATTRIBUTE_MAP = {
- COLLECTION_NAME: {
- 'network': {'allow_post': True, 'allow_put': False,
- 'validate': {'type:string': None},
- 'is_visible': True},
- 'report': {'allow_post': False, 'allow_put': False,
- 'is_visible': True},
- 'tenant_id': {'allow_post': True, 'allow_put': False,
- 'required_by_policy': True,
- 'validate': {'type:string': None}, 'is_visible': True},
- },
-}
-
-
-class Lsn(extensions.ExtensionDescriptor):
- """Enable LSN configuration for Neutron NSX networks."""
-
- @classmethod
- def get_name(cls):
- return "Logical Service Node configuration"
-
- @classmethod
- def get_alias(cls):
- return EXT_ALIAS
-
- @classmethod
- def get_description(cls):
- return "Enables configuration of NSX Logical Services Node."
-
- @classmethod
- def get_updated(cls):
- return "2013-10-05T10:00:00-00:00"
-
- @classmethod
- def get_resources(cls):
- """Returns Ext Resources."""
- exts = []
- plugin = manager.NeutronManager.get_plugin()
- resource_name = EXT_ALIAS
- collection_name = resource_name.replace('_', '-') + "s"
- params = RESOURCE_ATTRIBUTE_MAP.get(COLLECTION_NAME, dict())
- controller = base.create_resource(collection_name,
- resource_name,
- plugin, params, allow_bulk=False)
- ex = extensions.ResourceExtension(collection_name, controller)
- exts.append(ex)
- return exts
-
- def get_extended_resources(self, version):
- if version == "2.0":
- return RESOURCE_ATTRIBUTE_MAP
- else:
- return {}
+++ /dev/null
-# Copyright 2013 VMware, 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.
-
-from neutron.api import extensions
-from neutron.api.v2 import attributes
-
-
-MAC_LEARNING = 'mac_learning_enabled'
-EXTENDED_ATTRIBUTES_2_0 = {
- 'ports': {
- MAC_LEARNING: {'allow_post': True, 'allow_put': True,
- 'convert_to': attributes.convert_to_boolean,
- 'default': attributes.ATTR_NOT_SPECIFIED,
- 'is_visible': True},
- }
-}
-
-
-class Maclearning(extensions.ExtensionDescriptor):
- """Extension class supporting port mac learning."""
-
- @classmethod
- def get_name(cls):
- return "MAC Learning"
-
- @classmethod
- def get_alias(cls):
- return "mac-learning"
-
- @classmethod
- def get_description(cls):
- return "Provides MAC learning capabilities."
-
- @classmethod
- def get_updated(cls):
- return "2013-05-1T10:00:00-00:00"
-
- @classmethod
- def get_resources(cls):
- """Returns Ext Resources."""
- return []
-
- def get_extended_resources(self, version):
- if version == "2.0":
- return EXTENDED_ATTRIBUTES_2_0
- else:
- return {}
+++ /dev/null
-# Copyright 2013 VMware. 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.
-#
-
-import abc
-
-from oslo_config import cfg
-
-from neutron.api import extensions
-from neutron.api.v2 import attributes
-from neutron.api.v2 import resource_helper
-
-GATEWAY_RESOURCE_NAME = "network_gateway"
-DEVICE_RESOURCE_NAME = "gateway_device"
-# Use dash for alias and collection name
-EXT_ALIAS = GATEWAY_RESOURCE_NAME.replace('_', '-')
-NETWORK_GATEWAYS = "%ss" % EXT_ALIAS
-GATEWAY_DEVICES = "%ss" % DEVICE_RESOURCE_NAME.replace('_', '-')
-DEVICE_ID_ATTR = 'id'
-IFACE_NAME_ATTR = 'interface_name'
-
-
-# TODO(salv-orlando): This type definition is duplicated into
-# openstack/vmware-nsx. This temporary duplication should be removed once the
-# plugin decomposition is finished.
-# Allowed network types for the NSX Plugin
-class NetworkTypes(object):
- """Allowed provider network types for the NSX Plugin."""
- L3_EXT = 'l3_ext'
- STT = 'stt'
- GRE = 'gre'
- FLAT = 'flat'
- VLAN = 'vlan'
- BRIDGE = 'bridge'
-
-# Attribute Map for Network Gateway Resource
-# TODO(salvatore-orlando): add admin state as other neutron resources
-RESOURCE_ATTRIBUTE_MAP = {
- NETWORK_GATEWAYS: {
- 'id': {'allow_post': False, 'allow_put': False,
- 'is_visible': True},
- 'name': {'allow_post': True, 'allow_put': True,
- 'validate': {'type:string': attributes.NAME_MAX_LEN},
- 'is_visible': True, 'default': ''},
- 'default': {'allow_post': False, 'allow_put': False,
- 'is_visible': True},
- 'devices': {'allow_post': True, 'allow_put': False,
- 'validate': {'type:device_list': None},
- 'is_visible': True},
- 'ports': {'allow_post': False, 'allow_put': False,
- 'default': [],
- 'is_visible': True},
- 'tenant_id': {'allow_post': True, 'allow_put': False,
- 'validate': {'type:string':
- attributes.TENANT_ID_MAX_LEN},
- 'required_by_policy': True,
- 'is_visible': True}
- },
- GATEWAY_DEVICES: {
- 'id': {'allow_post': False, 'allow_put': False,
- 'is_visible': True},
- 'name': {'allow_post': True, 'allow_put': True,
- 'validate': {'type:string': attributes.NAME_MAX_LEN},
- 'is_visible': True, 'default': ''},
- 'client_certificate': {'allow_post': True, 'allow_put': True,
- 'validate': {'type:string': None},
- 'is_visible': True},
- 'connector_type': {'allow_post': True, 'allow_put': True,
- 'validate': {'type:connector_type': None},
- 'is_visible': True},
- 'connector_ip': {'allow_post': True, 'allow_put': True,
- 'validate': {'type:ip_address': None},
- 'is_visible': True},
- 'tenant_id': {'allow_post': True, 'allow_put': False,
- 'validate': {'type:string':
- attributes.TENANT_ID_MAX_LEN},
- 'required_by_policy': True,
- 'is_visible': True},
- 'status': {'allow_post': False, 'allow_put': False,
- 'is_visible': True},
- }
-}
-
-
-def _validate_device_list(data, valid_values=None):
- """Validate the list of service definitions."""
- if not data:
- # Devices must be provided
- msg = _("Cannot create a gateway with an empty device list")
- return msg
- try:
- for device in data:
- key_specs = {DEVICE_ID_ATTR:
- {'type:regex': attributes.UUID_PATTERN,
- 'required': True},
- IFACE_NAME_ATTR:
- {'type:string': None,
- 'required': False}}
- err_msg = attributes._validate_dict(
- device, key_specs=key_specs)
- if err_msg:
- return err_msg
- unexpected_keys = [key for key in device if key not in key_specs]
- if unexpected_keys:
- err_msg = (_("Unexpected keys found in device description:%s")
- % ",".join(unexpected_keys))
- return err_msg
- except TypeError:
- return (_("%s: provided data are not iterable") %
- _validate_device_list.__name__)
-
-
-def _validate_connector_type(data, valid_values=None):
- if not data:
- # A connector type is compulsory
- msg = _("A connector type is required to create a gateway device")
- return msg
- connector_types = (valid_values if valid_values else
- [NetworkTypes.GRE,
- NetworkTypes.STT,
- NetworkTypes.BRIDGE,
- 'ipsec%s' % NetworkTypes.GRE,
- 'ipsec%s' % NetworkTypes.STT])
- if data not in connector_types:
- msg = _("Unknown connector type: %s") % data
- return msg
-
-
-nw_gw_quota_opts = [
- cfg.IntOpt('quota_network_gateway',
- default=5,
- help=_('Number of network gateways allowed per tenant, '
- '-1 for unlimited'))
-]
-
-cfg.CONF.register_opts(nw_gw_quota_opts, 'QUOTAS')
-
-attributes.validators['type:device_list'] = _validate_device_list
-attributes.validators['type:connector_type'] = _validate_connector_type
-
-
-class Networkgw(extensions.ExtensionDescriptor):
- """API extension for Layer-2 Gateway support.
-
- The Layer-2 gateway feature allows for connecting neutron networks
- with external networks at the layer-2 level. No assumption is made on
- the location of the external network, which might not even be directly
- reachable from the hosts where the VMs are deployed.
-
- This is achieved by instantiating 'network gateways', and then connecting
- Neutron network to them.
- """
-
- @classmethod
- def get_name(cls):
- return "Network Gateway"
-
- @classmethod
- def get_alias(cls):
- return EXT_ALIAS
-
- @classmethod
- def get_description(cls):
- return "Connects Neutron networks with external networks at layer 2."
-
- @classmethod
- def get_updated(cls):
- return "2014-01-01T00:00:00-00:00"
-
- @classmethod
- def get_resources(cls):
- """Returns Ext Resources."""
-
- member_actions = {
- GATEWAY_RESOURCE_NAME.replace('_', '-'): {
- 'connect_network': 'PUT',
- 'disconnect_network': 'PUT'}}
-
- plural_mappings = resource_helper.build_plural_mappings(
- {}, RESOURCE_ATTRIBUTE_MAP)
-
- return resource_helper.build_resource_info(plural_mappings,
- RESOURCE_ATTRIBUTE_MAP,
- None,
- action_map=member_actions,
- register_quota=True,
- translate_name=True)
-
- def get_extended_resources(self, version):
- if version == "2.0":
- return RESOURCE_ATTRIBUTE_MAP
- else:
- return {}
-
-
-class NetworkGatewayPluginBase(object):
-
- @abc.abstractmethod
- def create_network_gateway(self, context, network_gateway):
- pass
-
- @abc.abstractmethod
- def update_network_gateway(self, context, id, network_gateway):
- pass
-
- @abc.abstractmethod
- def get_network_gateway(self, context, id, fields=None):
- pass
-
- @abc.abstractmethod
- def delete_network_gateway(self, context, id):
- pass
-
- @abc.abstractmethod
- def get_network_gateways(self, context, filters=None, fields=None,
- sorts=None, limit=None, marker=None,
- page_reverse=False):
- pass
-
- @abc.abstractmethod
- def connect_network(self, context, network_gateway_id,
- network_mapping_info):
- pass
-
- @abc.abstractmethod
- def disconnect_network(self, context, network_gateway_id,
- network_mapping_info):
- pass
-
- @abc.abstractmethod
- def create_gateway_device(self, context, gateway_device):
- pass
-
- @abc.abstractmethod
- def update_gateway_device(self, context, id, gateway_device):
- pass
-
- @abc.abstractmethod
- def delete_gateway_device(self, context, id):
- pass
-
- @abc.abstractmethod
- def get_gateway_device(self, context, id, fields=None):
- pass
-
- @abc.abstractmethod
- def get_gateway_devices(self, context, filters=None, fields=None,
- sorts=None, limit=None, marker=None,
- page_reverse=False):
- pass
+++ /dev/null
-# Copyright 2013 VMware, 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.
-#
-# TODO(arosen): This is deprecated in Juno, and
-# to be removed in Kxxxx.
-
-from neutron.plugins.vmware.extensions import qos
-
-
-class Nvp_qos(qos.Qos):
- """(Deprecated) Port Queue extension."""
-
- @classmethod
- def get_name(cls):
- return "nvp-qos"
-
- @classmethod
- def get_alias(cls):
- return "nvp-qos"
-
- @classmethod
- def get_description(cls):
- return "NVP QoS extension (deprecated)."
+++ /dev/null
-# Copyright 2013 VMware, 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.
-#
-
-import abc
-
-from neutron.api import extensions
-from neutron.api.v2 import attributes as attr
-from neutron.api.v2 import base
-from neutron.common import exceptions as nexception
-from neutron import manager
-
-
-# For policy.json/Auth
-qos_queue_create = "create_qos_queue"
-qos_queue_delete = "delete_qos_queue"
-qos_queue_get = "get_qos_queue"
-qos_queue_list = "get_qos_queues"
-
-
-class DefaultQueueCreateNotAdmin(nexception.InUse):
- message = _("Need to be admin in order to create queue called default")
-
-
-class DefaultQueueAlreadyExists(nexception.InUse):
- message = _("Default queue already exists.")
-
-
-class QueueInvalidDscp(nexception.InvalidInput):
- message = _("Invalid value for dscp %(data)s must be integer value"
- " between 0 and 63.")
-
-
-class QueueInvalidMarking(nexception.InvalidInput):
- message = _("The qos marking cannot be set to 'trusted' "
- "when the DSCP field is set")
-
-
-class QueueMinGreaterMax(nexception.InvalidInput):
- message = _("Invalid bandwidth rate, min greater than max.")
-
-
-class QueueInvalidBandwidth(nexception.InvalidInput):
- message = _("Invalid bandwidth rate, %(data)s must be a non negative"
- " integer.")
-
-
-class QueueNotFound(nexception.NotFound):
- message = _("Queue %(id)s does not exist")
-
-
-class QueueInUseByPort(nexception.InUse):
- message = _("Unable to delete queue attached to port.")
-
-
-class QueuePortBindingNotFound(nexception.NotFound):
- message = _("Port is not associated with lqueue")
-
-
-def convert_to_unsigned_int_or_none(val):
- if val is None:
- return
- try:
- val = int(val)
- if val < 0:
- raise ValueError()
- except (ValueError, TypeError):
- msg = _("'%s' must be a non negative integer.") % val
- raise nexception.InvalidInput(error_message=msg)
- return val
-
-
-def convert_to_unsigned_int_or_none_max_63(val):
- val = convert_to_unsigned_int_or_none(val)
- if val > 63:
- raise QueueInvalidDscp(data=val)
- return val
-
-# As per NSX API, if a queue is trusted, DSCP must be omitted; if a queue is
-# untrusted, DSCP must be specified. Whichever default values we choose for
-# the tuple (qos_marking, dscp), there will be at least one combination of a
-# request with conflicting values: for instance given the default values below,
-# requests with qos_marking = 'trusted' and the default dscp value will fail.
-# In order to avoid API users to explicitly specify a setting for clearing
-# the DSCP field when a trusted queue is created, the code serving this API
-# will adopt the following behaviour when qos_marking is set to 'trusted':
-# - if the DSCP attribute is set to the default value (0), silently drop
-# its value
-# - if the DSCP attribute is set to anything than 0 (but still a valid DSCP
-# value) return a 400 error as qos_marking and DSCP setting conflict.
-# TODO(salv-orlando): Evaluate whether it will be possible from a backward
-# compatibility perspective to change the default value for DSCP in order to
-# avoid this peculiar behaviour
-
-RESOURCE_ATTRIBUTE_MAP = {
- 'qos_queues': {
- 'id': {'allow_post': False, 'allow_put': False,
- 'is_visible': True},
- 'default': {'allow_post': True, 'allow_put': False,
- 'convert_to': attr.convert_to_boolean,
- 'is_visible': True, 'default': False},
- 'name': {'allow_post': True, 'allow_put': False,
- 'validate': {'type:string': attr.NAME_MAX_LEN},
- 'is_visible': True, 'default': ''},
- 'min': {'allow_post': True, 'allow_put': False,
- 'is_visible': True, 'default': '0',
- 'convert_to': convert_to_unsigned_int_or_none},
- 'max': {'allow_post': True, 'allow_put': False,
- 'is_visible': True, 'default': None,
- 'convert_to': convert_to_unsigned_int_or_none},
- 'qos_marking': {'allow_post': True, 'allow_put': False,
- 'validate': {'type:values': ['untrusted', 'trusted']},
- 'default': 'untrusted', 'is_visible': True},
- 'dscp': {'allow_post': True, 'allow_put': False,
- 'is_visible': True, 'default': '0',
- 'convert_to': convert_to_unsigned_int_or_none_max_63},
- 'tenant_id': {'allow_post': True, 'allow_put': False,
- 'required_by_policy': True,
- 'validate': {'type:string': attr.TENANT_ID_MAX_LEN},
- 'is_visible': True},
- },
-}
-
-
-QUEUE = 'queue_id'
-RXTX_FACTOR = 'rxtx_factor'
-EXTENDED_ATTRIBUTES_2_0 = {
- 'ports': {
- RXTX_FACTOR: {'allow_post': True,
- # FIXME(arosen): the plugin currently does not
- # implement updating rxtx factor on port.
- 'allow_put': True,
- 'is_visible': False,
- 'default': 1,
- 'enforce_policy': True,
- 'convert_to': attr.convert_to_positive_float_or_none},
-
- QUEUE: {'allow_post': False,
- 'allow_put': False,
- 'is_visible': True,
- 'default': False,
- 'enforce_policy': True}},
- 'networks': {QUEUE: {'allow_post': True,
- 'allow_put': True,
- 'is_visible': True,
- 'default': False,
- 'enforce_policy': True}}
-
-}
-
-
-class Qos(extensions.ExtensionDescriptor):
- """Port Queue extension."""
-
- @classmethod
- def get_name(cls):
- return "QoS Queue"
-
- @classmethod
- def get_alias(cls):
- return "qos-queue"
-
- @classmethod
- def get_description(cls):
- return "NSX QoS extension."
-
- @classmethod
- def get_updated(cls):
- return "2014-01-01T00:00:00-00:00"
-
- @classmethod
- def get_resources(cls):
- """Returns Ext Resources."""
- exts = []
- plugin = manager.NeutronManager.get_plugin()
- resource_name = 'qos_queue'
- collection_name = resource_name.replace('_', '-') + "s"
- params = RESOURCE_ATTRIBUTE_MAP.get(resource_name + "s", dict())
- controller = base.create_resource(collection_name,
- resource_name,
- plugin, params, allow_bulk=False)
-
- ex = extensions.ResourceExtension(collection_name,
- controller)
- exts.append(ex)
-
- return exts
-
- def get_extended_resources(self, version):
- if version == "2.0":
- return dict(EXTENDED_ATTRIBUTES_2_0.items() +
- RESOURCE_ATTRIBUTE_MAP.items())
- else:
- return {}
-
-
-class QueuePluginBase(object):
- @abc.abstractmethod
- def create_qos_queue(self, context, queue):
- pass
-
- @abc.abstractmethod
- def delete_qos_queue(self, context, id):
- pass
-
- @abc.abstractmethod
- def get_qos_queue(self, context, id, fields=None):
- pass
-
- @abc.abstractmethod
- def get_qos_queues(self, context, filters=None, fields=None, sorts=None,
- limit=None, marker=None, page_reverse=False):
- pass
+++ /dev/null
-# Copyright 2015 VMware, 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.
-
-from neutron.api import extensions
-from neutron.api.v2 import attributes
-
-
-ROUTER_TYPE = 'router_type'
-EXTENDED_ATTRIBUTES_2_0 = {
- 'routers': {
- ROUTER_TYPE: {'allow_post': True, 'allow_put': False,
- 'validate': {'type:values': ['shared', 'exclusive']},
- 'default': attributes.ATTR_NOT_SPECIFIED,
- 'is_visible': True},
- }
-}
-
-
-class Routertype(extensions.ExtensionDescriptor):
- """Extension class supporting router type."""
-
- @classmethod
- def get_name(cls):
- return "Router Type"
-
- @classmethod
- def get_alias(cls):
- return "nsxv-router-type"
-
- @classmethod
- def get_description(cls):
- return "Enables configuration of NSXv router type."
-
- @classmethod
- def get_updated(cls):
- return "2015-1-12T10:00:00-00:00"
-
- def get_required_extensions(self):
- return ["router"]
-
- @classmethod
- def get_resources(cls):
- """Returns Ext Resources."""
- return []
-
- def get_extended_resources(self, version):
- if version == "2.0":
- return EXTENDED_ATTRIBUTES_2_0
- else:
- return {}
+++ /dev/null
-# Copyright 2015 VMware, 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.
-
-from neutron.api import extensions
-from neutron.api.v2 import attributes
-
-# Attribute Map
-VNIC_INDEX = 'vnic_index'
-
-
-EXTENDED_ATTRIBUTES_2_0 = {
- 'ports': {
- VNIC_INDEX:
- {'allow_post': True,
- 'allow_put': True,
- 'is_visible': True,
- 'default': None,
- 'convert_to': attributes.convert_to_int_if_not_none}}}
-
-
-class Vnicindex(extensions.ExtensionDescriptor):
- @classmethod
- def get_name(cls):
- return "VNIC Index"
-
- @classmethod
- def get_alias(cls):
- return "vnic-index"
-
- @classmethod
- def get_description(cls):
- return ("Enable a port to be associated with a VNIC index")
-
- @classmethod
- def get_updated(cls):
- return "2014-09-15T12:00:00-00:00"
-
- def get_extended_resources(self, version):
- if version == "2.0":
- return EXTENDED_ATTRIBUTES_2_0
- else:
- return {}