Supporting Net-Partition as extension for Nuage plugin

A net-partition provides administrative separation between groups of tenant
routers/networks/subnets. Within a net-partition, subnets can be shared, and
VMs can connect multiple vNICs to subnets within the net-partition.
For security and isolation between organizations, VMs may not connect
VNICs to subnets within more than one net-partition.

This work is in accordance with bp/nuage-networks-plugin which is
under review: https://review.openstack.org/#/c/67272/

Change-Id: Ia9b0304f714c65548cd6b8ce6ff74a3075c4e673
Implements: blueprint nuage-net-partition-extension
This commit is contained in:
ronak
2014-02-04 16:38:13 -08:00
parent fba38c6b27
commit 1bc00e57d2
5 changed files with 150 additions and 2 deletions

View File

@@ -0,0 +1,59 @@
# Copyright 2014 Alcatel-Lucent USA Inc.
#
# 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.
#
# @author: Ronak Shah, Nuage Networks, Alcatel-Lucent USA Inc.
import logging
from neutronclient.neutron.v2_0 import CreateCommand
from neutronclient.neutron.v2_0 import DeleteCommand
from neutronclient.neutron.v2_0 import ListCommand
from neutronclient.neutron.v2_0 import ShowCommand
class ListNetPartition(ListCommand):
"""List netpartitions that belong to a given tenant."""
resource = 'net_partition'
log = logging.getLogger(__name__ + '.ListNetPartition')
list_columns = ['id', 'name']
class ShowNetPartition(ShowCommand):
"""Show information of a given netpartition."""
resource = 'net_partition'
log = logging.getLogger(__name__ + '.ShowNetPartition')
class CreateNetPartition(CreateCommand):
"""Create a netpartition for a given tenant."""
resource = 'net_partition'
log = logging.getLogger(__name__ + '.CreateNetPartition')
def add_known_arguments(self, parser):
parser.add_argument(
'name', metavar='name',
help='Name of NetPartition to create')
def args2body(self, parsed_args):
body = {'net_partition': {'name': parsed_args.name}, }
return body
class DeleteNetPartition(DeleteCommand):
"""Delete a given netpartition."""
resource = 'net_partition'
log = logging.getLogger(__name__ + '.DeleteNetPartition')

View File

@@ -42,6 +42,7 @@ from neutronclient.neutron.v2_0.lb import member as lb_member
from neutronclient.neutron.v2_0.lb import pool as lb_pool
from neutronclient.neutron.v2_0.lb import vip as lb_vip
from neutronclient.neutron.v2_0 import metering
from neutronclient.neutron.v2_0 import netpartition
from neutronclient.neutron.v2_0 import network
from neutronclient.neutron.v2_0 import networkprofile
from neutronclient.neutron.v2_0.nsx import networkgateway
@@ -259,6 +260,10 @@ COMMAND_V2 = {
'meter-label-rule-list': metering.ListMeteringLabelRule,
'meter-label-rule-show': metering.ShowMeteringLabelRule,
'meter-label-rule-delete': metering.DeleteMeteringLabelRule,
'nuage-netpartition-list': netpartition.ListNetPartition,
'nuage-netpartition-show': netpartition.ShowNetPartition,
'nuage-netpartition-create': netpartition.CreateNetPartition,
'nuage-netpartition-delete': netpartition.DeleteNetPartition,
}
COMMANDS = {'2.0': COMMAND_V2}

View File

@@ -193,7 +193,8 @@ class CLITestV20Base(testtools.TestCase):
'network_gateway', 'credential',
'network_profile', 'policy_profile',
'ikepolicy', 'ipsecpolicy',
'metering_label', 'metering_label_rule']
'metering_label', 'metering_label_rule',
'net_partition']
if (resource in non_admin_status_resources):
body = {resource: {}, }
else:

View File

@@ -0,0 +1,59 @@
# Copyright 2014 Alcatel-Lucent USA Inc.
#
# 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.
#
# @author: Ronak Shah, Nuage Networks, Alcatel-Lucent USA Inc.
import sys
from neutronclient.neutron.v2_0 import netpartition
from neutronclient.tests.unit import test_cli20
class CLITestV20NetPartitionJSON(test_cli20.CLITestV20Base):
resource = 'net_partition'
def test_create_netpartition(self):
cmd = netpartition.CreateNetPartition(test_cli20.MyApp(sys.stdout),
None)
name = 'myname'
myid = 'myid'
args = [name, ]
position_names = ['name', ]
position_values = [name, ]
self._test_create_resource(self.resource, cmd, name, myid, args,
position_names, position_values)
def test_list_netpartitions(self):
resources = '%ss' % self.resource
cmd = netpartition.ListNetPartition(test_cli20.MyApp(sys.stdout),
None)
self._test_list_resources(resources, cmd, True)
def test_show_netpartition(self):
cmd = netpartition.ShowNetPartition(test_cli20.MyApp(sys.stdout),
None)
args = ['--fields', 'id', '--fields', 'name', self.test_id]
self._test_show_resource(self.resource, cmd, self.test_id, args,
['id', 'name'])
def test_delete_netpartition(self):
cmd = netpartition.DeleteNetPartition(test_cli20.MyApp(sys.stdout),
None)
myid = 'myid'
args = [myid]
self._test_delete_resource(self.resource, cmd, myid, args)
class CLITestV20NetPartitionXML(CLITestV20NetPartitionJSON):
format = 'xml'

View File

@@ -221,6 +221,8 @@ class Client(object):
firewall_policy_remove_path = "/fw/firewall_policies/%s/remove_rule"
firewalls_path = "/fw/firewalls"
firewall_path = "/fw/firewalls/%s"
net_partitions_path = "/net-partitions"
net_partition_path = "/net-partitions/%s"
# API has no way to report plurals, so we have to hard code them
EXTED_PLURALS = {'routers': 'router',
@@ -243,7 +245,8 @@ class Client(object):
'firewall_policies': 'firewall_policy',
'firewalls': 'firewall',
'metering_labels': 'metering_label',
'metering_label_rules': 'metering_label_rule'
'metering_label_rules': 'metering_label_rule',
'net_partitions': 'net_partition'
}
# 8192 Is the default max URI len for eventlet.wsgi.server
MAX_URI_LEN = 8192
@@ -1110,6 +1113,27 @@ class Client(object):
return self.get(self.metering_label_rule_path %
(metering_label_rule), params=_params)
@APIParamsCall
def list_net_partitions(self, **params):
"""Fetch a list of all network partitions for a tenant."""
return self.get(self.net_partitions_path, params=params)
@APIParamsCall
def show_net_partition(self, netpartition, **params):
"""Fetch a network partition."""
return self.get(self.net_partition_path % (netpartition),
params=params)
@APIParamsCall
def create_net_partition(self, body=None):
"""Create a network partition."""
return self.post(self.net_partitions_path, body=body)
@APIParamsCall
def delete_net_partition(self, netpartition):
"""Delete the network partition."""
return self.delete(self.net_partition_path % netpartition)
def __init__(self, **kwargs):
"""Initialize a new client for the Neutron v2.0 API."""
super(Client, self).__init__()