Closes-Bug: #1190622 This fix improves the unit test coverage for the Cisco Nexus plugin's cisco_nexus_network_driver_v2.py and cisco_nexus_plugin_v2.py source files from: cisco_nexus_network_driver_v2: 72% cisco_nexus_plugin_v2: 79% To: cisco_nexus_network_driver_v2: 99% cisco_nexus_plugin_v2: 94% Much of what the remaining "uncovered" code (coverage tool reports as partially covered) can be attributed to the coverage tool not being aware that execution does not continue at the end of a save_and_reraise_exception() context block (i.e. the exception will be reraised, but the coverage tool isn't aware of this). This fix and coverage results are dependent on the fix for #1246080. Change-Id: Ie0e11fc0a12502739fb39bb4b30deb04dd31b7b0
176 lines
4.5 KiB
Python
176 lines
4.5 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
#
|
|
# Copyright 2012 Cisco Systems, 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.
|
|
#
|
|
# @author: Sumit Naiksatam, Cisco Systems, Inc.
|
|
|
|
from abc import ABCMeta, abstractmethod
|
|
import inspect
|
|
|
|
|
|
class L2DevicePluginBase(object):
|
|
"""Base class for a device-specific plugin.
|
|
|
|
An example of a device-specific plugin is a Nexus switch plugin.
|
|
The network model relies on device-category-specific plugins to perform
|
|
the configuration on each device.
|
|
"""
|
|
|
|
__metaclass__ = ABCMeta
|
|
|
|
@abstractmethod
|
|
def create_network(self, tenant_id, net_name, net_id, vlan_name, vlan_id,
|
|
**kwargs):
|
|
"""Create network.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def delete_network(self, tenant_id, net_id, **kwargs):
|
|
"""Delete network.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def update_network(self, tenant_id, net_id, name, **kwargs):
|
|
"""Update network.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def create_port(self, tenant_id, net_id, port_state, port_id, **kwargs):
|
|
"""Create port.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def delete_port(self, tenant_id, net_id, port_id, **kwargs):
|
|
"""Delete port.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def update_port(self, tenant_id, net_id, port_id, **kwargs):
|
|
"""Update port.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def plug_interface(self, tenant_id, net_id, port_id, remote_interface_id,
|
|
**kwargs):
|
|
"""Plug interface.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def unplug_interface(self, tenant_id, net_id, port_id, **kwargs):
|
|
"""Unplug interface.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
def create_subnet(self, tenant_id, net_id, ip_version,
|
|
subnet_cidr, **kwargs):
|
|
"""Create subnet.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
def get_subnets(self, tenant_id, net_id, **kwargs):
|
|
"""Get subnets.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
def get_subnet(self, tenant_id, net_id, subnet_id, **kwargs):
|
|
"""Get subnet.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
def update_subnet(self, tenant_id, net_id, subnet_id, **kwargs):
|
|
"""Update subnet.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
def delete_subnet(self, tenant_id, net_id, subnet_id, **kwargs):
|
|
"""Delete subnet.
|
|
|
|
:returns:
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
@classmethod
|
|
def __subclasshook__(cls, klass):
|
|
"""Check plugin class.
|
|
|
|
The __subclasshook__ method is a class method
|
|
that will be called everytime a class is tested
|
|
using issubclass(klass, Plugin).
|
|
In that case, it will check that every method
|
|
marked with the abstractmethod decorator is
|
|
provided by the plugin class.
|
|
"""
|
|
if cls is L2DevicePluginBase:
|
|
for method in cls.__abstractmethods__:
|
|
method_ok = False
|
|
for base in klass.__mro__:
|
|
if method in base.__dict__:
|
|
fn_obj = base.__dict__[method]
|
|
if inspect.isfunction(fn_obj):
|
|
abstract_fn_obj = cls.__dict__[method]
|
|
arg_count = fn_obj.func_code.co_argcount
|
|
expected_arg_count = \
|
|
abstract_fn_obj.func_code.co_argcount
|
|
method_ok = arg_count == expected_arg_count
|
|
if method_ok:
|
|
continue
|
|
return NotImplemented
|
|
return True
|
|
return NotImplemented
|