Skip to content

Commit

Permalink
Base ISE connector implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
dwapstra committed May 30, 2024
1 parent f6cd9bb commit 095be51
Show file tree
Hide file tree
Showing 19 changed files with 154 additions and 16 deletions.
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ def find_version(*paths):
'requests >= 1.15.1',
'dict2xml',
'f5-icontrol-rest',
'ciscoisesdk'
],

# any additional groups of dependencies.
Expand Down
2 changes: 1 addition & 1 deletion src/rest/connector/libs/apic/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='apic')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/bigip/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='bigip')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/dcnm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='dcnm')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/dnac/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='dnac')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/elasticsearch/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='elasticsearch')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/iosxe/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='iosxe')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 2 additions & 0 deletions src/rest/connector/libs/ise/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from genie import abstract
abstract.declare_token(os='ise')
135 changes: 135 additions & 0 deletions src/rest/connector/libs/ise/implementation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@

import logging
import urllib.request
from requests.exceptions import RequestException

from pyats.connections import BaseConnection
from rest.connector.utils import get_username_password
from rest.connector.implementation import Implementation as RestImplementation

from ciscoisesdk import IdentityServicesEngineAPI

# create a logger for this module
log = logging.getLogger(__name__)


class Implementation(RestImplementation):
'''Rest Implementation for ISE
Implementation of Rest connection to ISE servers
YAML Example
------------
devices:
ise:
os: ise
connections:
rest:
class: rest.connector.Rest
ip: 127.0.0.1
port: "443"
protocol: https
credentials:
rest:
username: admin
password: admin
Code Example
------------
>>> from pyats.topology import loader
>>> testbed = loader.load('topology.yaml')
>>> device = testbed.devices['ise']
>>> device.connect(alias='rest', via='rest')
>>> device.rest.connected
True
'''

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if 'proxies' not in kwargs:
self.proxies = urllib.request.getproxies()

@BaseConnection.locked
def connect(self,
timeout=30,
verbose=False,
port="443",
protocol='https',
debug=False,
**kwargs):
'''connect to the device via REST
Arguments
---------
timeout (int): Timeout value
default_content_type: Default for content type, json or xml
proxies: Specify the proxy to use for connection as seen below.
{'http': 'http://proxy.esl.cisco.com:80/',
'ftp': 'http://proxy.esl.cisco.com:80/',
'https': 'http://proxy.esl.cisco.com:80/',
'no': '.cisco.com'}
Raises
------
Exception
---------
If the connection did not go well
'''
if self.connected:
log.info(f'{self} already connected')
return

# support sshtunnel
if 'sshtunnel' in self.connection_info:
try:
from unicon.sshutils import sshtunnel
except ImportError:
raise ImportError(
'`unicon` is not installed for `sshtunnel`. Please install by `pip install unicon`.'
)
try:
tunnel_port = sshtunnel.auto_tunnel_add(self.device, self.via)
if tunnel_port:
ip = self.device.connections[self.via].sshtunnel.tunnel_ip
port = tunnel_port
except AttributeError as e:
raise AttributeError(
"Cannot add ssh tunnel. Connection %s may not have ip/host or port.\n%s"
% (self.via, e))
else:
ip = self.connection_info.ip.exploded
port = self.connection_info.get('port', port)

if 'protocol' in self.connection_info:
protocol = self.connection_info['protocol']

self.base_url = '{protocol}://{ip}:{port}'.format(protocol=protocol,
ip=ip,
port=port)

username, password = get_username_password(self)

breakpoint()
self.api = IdentityServicesEngineAPI(
username=username, password=password,
base_url=self.base_url, uses_api_gateway=True,
verify=False, debug=debug)

self._is_connected = True
log.info("Connected successfully to '{d}'".format(d=self.device.name))

return self.api

@BaseConnection.locked
def disconnect(self):
"""
Does not make sense to disconnect from a device.
"""
self._is_connected = False
return
2 changes: 1 addition & 1 deletion src/rest/connector/libs/nd/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='nd')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/nexusdashboard/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='nexusdashboard')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/nso/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='nso')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/nxos/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='nxos')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/nxos/aci/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(platform='aci')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/viptela/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='viptela')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/virl/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='virl')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/vmware/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='vmware')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/webex/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='webex')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))
2 changes: 1 addition & 1 deletion src/rest/connector/libs/xpresso/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Enable abstraction using this directory name as the abstraction token
try:
from genie import abstract
abstract.declare_token(__name__)
abstract.declare_token(os='xpresso')
except Exception as e:
import warnings
warnings.warn('Could not declare abstraction token: ' + str(e))

0 comments on commit 095be51

Please sign in to comment.