Skip to content

Commit 44472c3

Browse files
authored
Saimon/edge filer statistics (#356)
1 parent d65fb9d commit 44472c3

9 files changed

Lines changed: 272 additions & 8 deletions

File tree

cterasdk/edge/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
'shares',
3131
'shell',
3232
'smb',
33+
'statistics',
3334
'support',
3435
'sync',
3536
'syslog',

cterasdk/edge/enum.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,3 +437,43 @@ class ResourceError:
437437
"""
438438
FileExists = 'File exists'
439439
Forbidden = 'Creating a folder in this location is forbidden'
440+
441+
442+
class Metric:
443+
"""
444+
Metric
445+
446+
:ivar str CPU: CPU
447+
:ivar str Memory: Memory
448+
:ivar str Volume: Volume
449+
:ivar str Cache: Cache Stats
450+
:ivar str Connections: Connections
451+
:ivar str Disk: Disk I/O
452+
:ivar str Local: Local I/O
453+
:ivar str CloudSync: Cloud Sync
454+
"""
455+
CPU = 'cpu'
456+
Memory = 'memory'
457+
Volume = 'volume'
458+
Cache = 'cache'
459+
Connections = 'connections'
460+
Disk = 'disk_io'
461+
Local = 'local_io'
462+
CloudSync = 'cloud_io'
463+
464+
465+
class Interval:
466+
"""
467+
Interval
468+
469+
:ivar str Hour: Hour (Real-time)
470+
:ivar str Day: Day
471+
:ivar str Week: Week
472+
:ivar str Month: Month
473+
:ivar str Year: Year
474+
"""
475+
Hour = 'hour'
476+
Day = 'day'
477+
Week = 'week'
478+
Month = 'month'
479+
Year = 'year'

cterasdk/edge/remote.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def remote_access(device, Portal):
1414
logger.info("Enabling remote access. %s", {'tenant': device_tenant, 'device': device_name})
1515
token = authn_token(Portal, device_tenant, device_name)
1616
device_object = create_device_object(device)
17-
device_object.sso(token)
17+
device_object.sso(token, {Portal._session_id_key: Portal.get_session_id()}) # pylint: disable=protected-access
1818
logger.info("Enabled remote access. %s", {'tenant': device_tenant, 'device': device_name})
1919
return device_object
2020

cterasdk/edge/statistics.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
from .enum import Metric
2+
from .base_command import BaseCommand
3+
4+
5+
class Statistics(BaseCommand):
6+
""" Edge Filer Statistics API """
7+
8+
def cpu(self, interval):
9+
"""
10+
CPU Statistics
11+
12+
:param cterasdk.edge.enum.Interval interval: Interval
13+
:return: Statistics Object
14+
:rtype: cterasdk.common.object.Object
15+
"""
16+
return self._statistics(Metric.CPU, interval)
17+
18+
def memory(self, interval):
19+
"""
20+
Memory Statistics
21+
22+
:param cterasdk.edge.enum.Interval interval: Interval
23+
:return: Statistics Object
24+
:rtype: cterasdk.common.object.Object
25+
"""
26+
return self._statistics(Metric.Memory, interval)
27+
28+
def volume(self, interval):
29+
"""
30+
Volume Statistics
31+
32+
:param cterasdk.edge.enum.Interval interval: Interval
33+
:return: Statistics Object
34+
:rtype: cterasdk.common.object.Object
35+
"""
36+
return self._statistics(Metric.Volume, interval)
37+
38+
def cache(self, interval):
39+
"""
40+
Cache Statistics
41+
42+
:param cterasdk.edge.enum.Interval interval: Interval
43+
:return: Statistics Object
44+
:rtype: cterasdk.common.object.Object
45+
"""
46+
return self._statistics(Metric.Cache, interval)
47+
48+
def connections(self, interval):
49+
"""
50+
Connections Statistics
51+
52+
:param cterasdk.edge.enum.Interval interval: Interval
53+
:return: Statistics Object
54+
:rtype: cterasdk.common.object.Object
55+
"""
56+
return self._statistics(Metric.Connections, interval)
57+
58+
def disk(self, interval):
59+
"""
60+
Disk I/O Statistics
61+
62+
:param cterasdk.edge.enum.Interval interval: Interval
63+
:return: Statistics Object
64+
:rtype: cterasdk.common.object.Object
65+
"""
66+
return self._statistics(Metric.Disk, interval)
67+
68+
def local_io(self, interval):
69+
"""
70+
Local I/O Statistics
71+
72+
:param cterasdk.edge.enum.Interval interval: Interval
73+
:return: Statistics Object
74+
:rtype: cterasdk.common.object.Object
75+
"""
76+
return self._statistics(Metric.Local, interval)
77+
78+
def cloudsync(self, interval):
79+
"""
80+
Cloud Synchronization Statistics
81+
82+
:param cterasdk.edge.enum.Interval interval: Interval
83+
:return: Statistics Object
84+
:rtype: cterasdk.common.object.Object
85+
"""
86+
return self._statistics(Metric.CloudSync, interval)
87+
88+
def _statistics(self, metric, interval):
89+
return self._edge.clients.stats.get(metric, params={
90+
'interval': interval
91+
})

cterasdk/objects/services.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,13 @@ def test(self):
143143
def _session_id_key(self):
144144
return NotImplementedError("Subclass must implement the '_session_id_key' property")
145145

146-
def get_session_id(self):
146+
def get_session_id(self, response_url=None):
147147
"""
148148
Get Session Identifier
149149
150150
:return str: Session ID
151151
"""
152-
return self._default.cookie_jar.get(self._default.baseurl, self._session_id_key)
152+
return self._default.cookie_jar.get(response_url if response_url else self._default.baseurl, self._session_id_key)
153153

154154
def set_session_id(self, session_id):
155155
self._default.cookie_jar.update_cookies({self._session_id_key: session_id}, self._default.baseurl)

cterasdk/objects/synchronous/core.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ def context(self):
9393
def _session_id_key(self):
9494
return 'JSESSIONID'
9595

96+
def get_session_id(self): # pylint: disable=arguments-differ
97+
return super().get_session_id(self.ctera.baseurl)
98+
9699
def _authenticator(self, url):
97100
return authenticators.core(self.session(), url, self.context)
98101

cterasdk/objects/synchronous/edge.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
afp, aio, antivirus, array, audit, backup, cache, cli, config, connection, ctera_migrate,
1212
dedup, directoryservice, drive, files, firmware, ftp, groups, licenses, login,
1313
logs, mail, network, nfs, ntp, power, remote, rsync, ransom_protect, services,
14-
shares, shell, smb, snmp, ssh, ssl, support, sync, syslog, tasks, telnet,
14+
shares, shell, smb, snmp, ssh, ssl, statistics, support, sync, syslog, tasks, telnet,
1515
timezone, users, volumes,
1616
)
1717

@@ -27,6 +27,7 @@ def __init__(self, edge, Portal):
2727
else:
2828
self.migrate = edge.default.clone(clients.Migrate, EndpointBuilder.new(edge.base, '/migration/rest/v1'))
2929
self.api = edge.default.clone(clients.API, EndpointBuilder.new(edge.base, '/admingui/api'))
30+
self.stats = edge.default.clone(clients.JSON, EndpointBuilder.new(edge.base, '/stats'))
3031
self.io = IO(edge)
3132

3233

@@ -108,6 +109,7 @@ def __init__(self, host=None, port=None, https=True, Portal=None, *, base=None):
108109
self.snmp = snmp.SNMP(self)
109110
self.ssh = ssh.SSH(self)
110111
self.ssl = modules.initialize(ssl.SSLModule, self)
112+
self.statistics = statistics.Statistics(self)
111113
self.support = support.Support(self)
112114
self.sync = sync.Sync(self)
113115
self.syslog = syslog.Syslog(self)
@@ -151,8 +153,14 @@ def initialized(self):
151153
def test(self):
152154
return connection.test(self)
153155

154-
def sso(self, ticket):
155-
""" Login using Single Sign On"""
156+
def sso(self, ticket, session):
157+
"""
158+
Single Sign on from CTERA Portal to CTERA Edge Filer.
159+
160+
:param str ticket: SSO Ticket
161+
:param dict session: CTERA Portal Session Cookie
162+
"""
163+
self.default.cookie_jar.update_cookies(session, self.default.baseurl)
156164
self._login_object.sso(ticket)
157165
self.session().start_session(self)
158166

@@ -164,5 +172,5 @@ def _omit_fields(self):
164172
return super()._omit_fields + ['afp', 'aio', 'array', 'audit', 'antivirus', 'backup', 'cache', 'cli', 'config', 'ctera_migrate',
165173
'dedup', 'directoryservice', 'drive', 'files', 'firmware', 'ftp', 'groups', 'licenses', 'logs',
166174
'mail', 'network', 'nfs', 'ntp', 'power', 'ransom_protect', 'rsync', 'services', 'shares', 'shell',
167-
'smb', 'snmp', 'ssh', 'ssl', 'support', 'sync', 'syslog', 'tasks', 'telnet', 'timezone',
168-
'users', 'volumes']
175+
'smb', 'snmp', 'ssh', 'ssl', 'statistics', 'support', 'sync', 'syslog', 'tasks', 'telnet',
176+
'timezone', 'users', 'volumes']

docs/source/UserGuides/Edge/Configuration.rst

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1505,6 +1505,65 @@ SSH
15051505
15061506
edge.ssh.disable()
15071507
1508+
Statistics
1509+
==========
1510+
1511+
.. automethod:: cterasdk.edge.statistics.Statistics.cpu
1512+
:noindex:
1513+
1514+
.. code-block:: python
1515+
1516+
edge.statistics.cpu(edge_enum.Interval.Day)
1517+
1518+
.. automethod:: cterasdk.edge.statistics.Statistics.memory
1519+
:noindex:
1520+
1521+
.. code-block:: python
1522+
1523+
edge.statistics.memory(edge_enum.Interval.Day)
1524+
1525+
.. automethod:: cterasdk.edge.statistics.Statistics.volume
1526+
:noindex:
1527+
1528+
.. code-block:: python
1529+
1530+
edge.statistics.volume(edge_enum.Interval.Day)
1531+
1532+
.. automethod:: cterasdk.edge.statistics.Statistics.cache
1533+
:noindex:
1534+
1535+
.. code-block:: python
1536+
1537+
edge.statistics.cache(edge_enum.Interval.Day)
1538+
1539+
.. automethod:: cterasdk.edge.statistics.Statistics.connections
1540+
:noindex:
1541+
1542+
.. code-block:: python
1543+
1544+
edge.statistics.connections(edge_enum.Interval.Day)
1545+
1546+
.. automethod:: cterasdk.edge.statistics.Statistics.disk
1547+
:noindex:
1548+
1549+
.. code-block:: python
1550+
1551+
edge.statistics.disk(edge_enum.Interval.Day)
1552+
1553+
.. automethod:: cterasdk.edge.statistics.Statistics.local_io
1554+
:noindex:
1555+
1556+
.. code-block:: python
1557+
1558+
edge.statistics.local_io(edge_enum.Interval.Day)
1559+
1560+
.. automethod:: cterasdk.edge.statistics.Statistics.cloudsync
1561+
:noindex:
1562+
1563+
.. code-block:: python
1564+
1565+
edge.statistics.cloudsync(edge_enum.Interval.Day)
1566+
15081567
Miscellaneous
15091568
-------------
15101569

tests/ut/edge/test_statistics.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
from unittest import mock
2+
3+
from cterasdk.edge import statistics
4+
from cterasdk.edge.enum import Interval, Metric
5+
from tests.ut.edge import base_edge
6+
7+
8+
class TestEdgeStatistics(base_edge.BaseEdgeTest):
9+
10+
def setUp(self):
11+
super().setUp()
12+
self._filer.clients.stats.get = mock.MagicMock()
13+
self.intervals = (Interval.Hour, Interval.Day, Interval.Week, Interval.Month, Interval.Year)
14+
15+
def test_cpu(self):
16+
for interval in self.intervals:
17+
self._init_filer()
18+
statistics.Statistics(self._filer).cpu(interval)
19+
self._filer.clients.stats.get.assert_called_with(Metric.CPU, params={'interval': interval})
20+
21+
def test_memory(self):
22+
self._init_filer()
23+
for interval in self.intervals:
24+
self._init_filer()
25+
statistics.Statistics(self._filer).memory(interval)
26+
self._filer.clients.stats.get.assert_called_with(Metric.Memory, params={'interval': interval})
27+
28+
def test_volume(self):
29+
for interval in self.intervals:
30+
self._init_filer()
31+
statistics.Statistics(self._filer).volume(interval)
32+
self._filer.clients.stats.get.assert_called_with(Metric.Volume, params={'interval': interval})
33+
34+
def test_cache(self):
35+
for interval in self.intervals:
36+
self._init_filer()
37+
statistics.Statistics(self._filer).cache(interval)
38+
self._filer.clients.stats.get.assert_called_with(Metric.Cache, params={'interval': interval})
39+
40+
def test_connections(self):
41+
for interval in self.intervals:
42+
self._init_filer()
43+
statistics.Statistics(self._filer).connections(interval)
44+
self._filer.clients.stats.get.assert_called_with(Metric.Connections, params={'interval': interval})
45+
46+
def test_disk(self):
47+
for interval in self.intervals:
48+
self._init_filer()
49+
statistics.Statistics(self._filer).disk(interval)
50+
self._filer.clients.stats.get.assert_called_with(Metric.Disk, params={'interval': interval})
51+
52+
def test_local_io(self):
53+
for interval in self.intervals:
54+
self._init_filer()
55+
statistics.Statistics(self._filer).local_io(interval)
56+
self._filer.clients.stats.get.assert_called_with(Metric.Local, params={'interval': interval})
57+
58+
def test_cloudsync(self):
59+
for interval in self.intervals:
60+
self._init_filer()
61+
statistics.Statistics(self._filer).cloudsync(interval)
62+
self._filer.clients.stats.get.assert_called_with(Metric.CloudSync, params={'interval': interval})

0 commit comments

Comments
 (0)