From f0ffdeb221bf8ce466ac7a68f2cb8590fcf937be Mon Sep 17 00:00:00 2001 From: Gary Kotton Date: Mon, 29 Dec 2014 01:38:25 -0800 Subject: [PATCH] VMWare-NSXv: VMWare NSXv extensions For Kilo, the vendor-specific code should be moved to stackforge repo, excluding the extensions (https://review.openstack.org/#/c/134680/). This patch adds the extensions VMWare NSXv plugin from stackforge/vmware-nsx repo. There are 2 new extensions: 1. advanced_service_providers - this is required to enabled the NSXv to provide metadata support (there is no metadata agent) 2. vnic_index - the security group support for the NSXv requires the vNIC index Change-Id: I8c7aa95db1caf020afaa217d9c543b9031fab371 Partially-Implements: blueprint vmware-nsx-v --- neutron/api/v2/attributes.py | 6 ++ .../extensions/advancedserviceproviders.py | 56 +++++++++++++++++++ .../plugins/vmware/extensions/vnicindex.py | 56 +++++++++++++++++++ neutron/tests/unit/test_attributes.py | 6 ++ 4 files changed, 124 insertions(+) create mode 100644 neutron/plugins/vmware/extensions/advancedserviceproviders.py create mode 100644 neutron/plugins/vmware/extensions/vnicindex.py diff --git a/neutron/api/v2/attributes.py b/neutron/api/v2/attributes.py index 7540509d8..8959120b9 100644 --- a/neutron/api/v2/attributes.py +++ b/neutron/api/v2/attributes.py @@ -536,6 +536,12 @@ def convert_to_int(data): raise n_exc.InvalidInput(error_message=msg) +def convert_to_int_if_not_none(data): + if data is not None: + return convert_to_int(data) + return data + + def convert_kvp_str_to_list(data): """Convert a value of the form 'key=value' to ['key', 'value']. diff --git a/neutron/plugins/vmware/extensions/advancedserviceproviders.py b/neutron/plugins/vmware/extensions/advancedserviceproviders.py new file mode 100644 index 000000000..ba6203639 --- /dev/null +++ b/neutron/plugins/vmware/extensions/advancedserviceproviders.py @@ -0,0 +1,56 @@ +# 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. + + +# 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(object): + @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_namespace(cls): + return( + "http://docs.openstack.org/ext/neutron/" + "advanced_service_providers/api/v1.0") + + @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 {} diff --git a/neutron/plugins/vmware/extensions/vnicindex.py b/neutron/plugins/vmware/extensions/vnicindex.py new file mode 100644 index 000000000..9b0e6d05c --- /dev/null +++ b/neutron/plugins/vmware/extensions/vnicindex.py @@ -0,0 +1,56 @@ +# 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.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(object): + @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_namespace(cls): + return "http://docs.openstack.org/ext/neutron/vnic_index/api/v1.0" + + @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 {} diff --git a/neutron/tests/unit/test_attributes.py b/neutron/tests/unit/test_attributes.py index 54a44b1f8..163bbf544 100644 --- a/neutron/tests/unit/test_attributes.py +++ b/neutron/tests/unit/test_attributes.py @@ -763,6 +763,12 @@ class TestConvertToInt(base.BaseTestCase): self.assertEqual(attributes.convert_to_int(0), 0) self.assertEqual(attributes.convert_to_int(1), 1) + def test_convert_to_int_if_not_none(self): + self.assertEqual(attributes.convert_to_int_if_not_none(-1), -1) + self.assertEqual(attributes.convert_to_int_if_not_none(0), 0) + self.assertEqual(attributes.convert_to_int_if_not_none(1), 1) + self.assertIsNone(attributes.convert_to_int_if_not_none(None)) + def test_convert_to_int_str(self): self.assertEqual(attributes.convert_to_int('4'), 4) self.assertEqual(attributes.convert_to_int('6'), 6) -- 2.45.2