Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Netconf custom verifier #102

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions verifiers/src/yang/verifiers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@
__contact__ = '[email protected]'
__copyright__ = 'Cisco Systems, Inc.'

from .count_verifier import CountVerifier
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was this removed intentionally? Seems strange to just get rid of it

from .base_verifier import BaseVerifier
from .count_verifier import NetconfCountVerifier, GnmiCountVerifier

__all__ = (
'BaseVerifier',
'CountVerifier',
'NetconfCountVerifier',
'GnmiCountVerifier'
)
60 changes: 52 additions & 8 deletions verifiers/src/yang/verifiers/count_verifier.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
from typing import List
from typing import Any, List
from dataclasses import field, dataclass
from google.protobuf import json_format

# Import base classes. For non pyats installation you can use class provided within this module
try:
from genie.libs.sdk.triggers.blitz.verifiers import GnmiDefaultVerifier
from genie.libs.sdk.triggers.blitz.verifiers import GnmiDefaultVerifier, NetconfDefaultVerifier
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this or GnmiDefaultVerifier failed to import, then the entire file will break since you won't be able to subclass NetconfDefaultVerifier. Is there something in the exception below you should be doing?

except ImportError:
from yang.verifiers.base_verifier import BaseVerifier as GnmiDefaultVerifier


class CountVerifier(GnmiDefaultVerifier):
class GnmiCountVerifier(GnmiDefaultVerifier):
from genie.libs.sdk.triggers.blitz.rpcverify import OptFields

@dataclass
class MyCustomReturns(OptFields):
class CustomReturns(OptFields):
'''
Create a custom returns class to be used by the verifier
by adding new fields to the default returns dataclass
Expand All @@ -23,15 +23,15 @@ class MyCustomReturns(OptFields):
found_items: int = 0

@property
def returns(self) -> List[MyCustomReturns]:
def returns(self) -> List[CustomReturns]:
return self._returns

@returns.setter
def returns(self, value: List[dict]) -> List[MyCustomReturns]:
def returns(self, value: List[dict]) -> List[CustomReturns]:
'''
Register our custom returns class
'''
self._returns = [self.MyCustomReturns(**r) for r in value]
self._returns = [self.CustomReturns(**r) for r in value]

def decode(self, response, namespace: dict = None, method: str = 'get') -> List[dict]:
from genie.libs.sdk.triggers.blitz.gnmi_util import GnmiMessage
Expand Down Expand Up @@ -61,6 +61,50 @@ def end_subscription(self, errors):
if errors:
return False
for ret in self.returns:
if ret.count != ret.found_items or ret.found_items < self.kwargs['min_count']:
if (ret.count != ret.found_items or
ret.found_items < self.format['verifier']['min_count']):
return False
return True


class NetconfCountVerifier(NetconfDefaultVerifier):
from genie.libs.sdk.triggers.blitz.rpcverify import OptFields

@dataclass
class CustomReturns(OptFields):
'''
Create a custom returns class to be used by the verifier
by adding new fields to the default returns dataclass
'''
cli_return: dict = field(default_factory=dict)
count: int = 0
found_items: int = 0

@property
def returns(self) -> List[CustomReturns]:
return self._returns

@returns.setter
def returns(self, value: List[dict]) -> List[CustomReturns]:
'''
Register our custom returns class
'''
self._returns = [self.CustomReturns(**r) for r in value]

def get_config_verify(self, raw_response: Any) -> bool:
# Here we have raw netconf xml response
# We are decoding it using default netconf decoder
# but you can use your own decode method
try:
decoded_response = self.decode(raw_response)
except self.DecodeError:
return False
for response in decoded_response:
for ret in self.returns:
if response[1] == ret.xpath:
ret.found_items += 1
for ret in self.returns:
if (ret.count != ret.found_items or
ret.found_items < self.format['verifier']['min_count']):
return False
return True