Skip to content

Commit

Permalink
Saimon/server tasks (#172)
Browse files Browse the repository at this point in the history
  • Loading branch information
saimonation committed Dec 20, 2022
1 parent 4e93395 commit f638816
Show file tree
Hide file tree
Showing 8 changed files with 186 additions and 2 deletions.
19 changes: 19 additions & 0 deletions cterasdk/core/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import logging

from .base_command import BaseCommand


class CLI(BaseCommand):
""" Portal CLI APIs """

def run_command(self, cli_command):
"""
Run a CLI command
:param str cli_command: The CLI command to run on the gateway
:return str: The response of the Portal
"""
logging.getLogger().info("Executing CLI command. %s", {'cli_command': cli_command})
response = self._portal.execute('', 'debugCmd', cli_command)
logging.getLogger().info("CLI command executed. %s", {'cli_command': cli_command})
return response
27 changes: 27 additions & 0 deletions cterasdk/core/servers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from ..common import union, Object
from .base_command import BaseCommand
from .types import ScheduledTask, BackgroundTask
from . import query
from ..exception import CTERAException, ObjectNotFoundException

Expand All @@ -13,6 +14,10 @@ class Servers(BaseCommand):

default = ['name']

def __init__(self, portal):
super().__init__(portal)
self.tasks = Tasks(self._portal)

def _get_entire_object(self, server):
try:
return self._portal.get(f'/servers/{server}')
Expand Down Expand Up @@ -89,3 +94,25 @@ def modify(self, name, server_name=None, app=None, preview=None, enable_public_i
except CTERAException as error:
logging.getLogger().error("Could not modify server.")
raise CTERAException('Could not modify server', error)


class Tasks(BaseCommand):

def background(self, name):
"""
Get all background tasks
:param str name: Name of the server
:return: List of tasks
"""
return [BackgroundTask.from_server_object(task, f'servers/{name}/bgTasks/{task.id}')
for task in self._portal.get(f'/servers/{name}/bgTasks')]

def scheduled(self, name):
"""
Get all scheduled tasks
:param str name: Name of the server
:return: List of tasks
"""
return [ScheduledTask.from_server_object(task) for task in self._portal.get(f'/servers/{name}/schedTasks')]
47 changes: 47 additions & 0 deletions cterasdk/core/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -597,3 +597,50 @@ def build(self):
:rtype: cterasdk.common.object.Object
"""
return self.param


class Task(Object):

def __init__(self, task_id, name):
self.id = task_id
self.name = name


class ScheduledTask(Task):

def __init__(self, task_id, name, start_time):
super().__init__(task_id, name)
self.start_time = start_time

@staticmethod
def from_server_object(server_object):
return ScheduledTask(
server_object.id,
server_object.name,
server_object.startTime,
)


class BackgroundTask(Task):

def __init__(self, task_id, name, start_time, end_time, elapsed_time, status, message, ref):
super().__init__(task_id, name)
self.start_time = start_time
self.end_time = end_time
self.elapsed_time = elapsed_time
self.status = status
self.message = message
self.ref = ref

@staticmethod
def from_server_object(server_object, ref):
return BackgroundTask(
server_object.id,
server_object.name,
server_object.startTime,
server_object.endTime,
server_object.elapsedTime,
server_object.status,
server_object.progstring,
ref
)
3 changes: 3 additions & 0 deletions cterasdk/object/Portal.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from ..core import activation
from ..core import antivirus
from ..core import buckets
from ..core import cli
from ..core import decorator
from ..core import directoryservice
from ..core import firmwares
Expand Down Expand Up @@ -172,6 +173,7 @@ class GlobalAdmin(Portal): # pylint: disable=too-many-instance-attributes
Main class for Global Admin operations on a Portal
:ivar cterasdk.core.portals.Portals portals: Object holding the Portals Management APIs
:ivar cterasdk.core.cli.CLI cli: Object holding the Portal GlobalAdmin CLI APIs
:ivar cterasdk.core.servers.Servers servers: Object holding the Servers Management APIs
:ivar cterasdk.core.setup.Setup setup: Object holding the Portal setup APIs
:ivar cterasdk.core.ssl.SSL ssl: Object holding the Portal SSL Certificate APIs
Expand All @@ -192,6 +194,7 @@ def __init__(self, host, port=None, https=True):
super().__init__(host, port, https)
self.portals = portals.Portals(self)
self.servers = servers.Servers(self)
self.cli = cli.CLI(self)
self.setup = setup.Setup(self)
self.ssl = ssl.SSL(self)
self.startup = startup.Startup(self)
Expand Down
31 changes: 31 additions & 0 deletions docs/source/user_guides/Portal/GlobalAdmin.rst
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,25 @@ Servers
admin.servers.modify('server2', enable_public_ip=True, public_ip='33.191.55.2') # configure a public NAT ip address
Server Tasks
^^^^^^^^^^^^

.. automethod:: cterasdk.core.servers.Tasks.background
:noindex:

.. code-block:: python
for task in admin.servers.tasks.background('database'):
print(task.name)
.. automethod:: cterasdk.core.servers.Tasks.scheduled
:noindex:

.. code-block:: python
for task in admin.servers.tasks.scheduled('database'):
print(task.name)
Messaging Service
-----------------
.. automethod:: cterasdk.core.messaging.Messaging.get_status
Expand Down Expand Up @@ -1336,3 +1355,15 @@ Syslog

.. automethod:: cterasdk.core.syslog.Syslog.disable
:noindex:


CLI Execution
-------------

.. automethod:: cterasdk.core.cli.CLI.run_command
:noindex:

.. code-block:: python
result = admin.cli.run_command('show /settings')
print(result)
16 changes: 16 additions & 0 deletions tests/ut/test_core_cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from cterasdk.core import cli
from tests.ut import base_core


class TestCoreCLI(base_core.BaseCoreTest):

def setUp(self):
super().setUp()
self._cli_command = 'show /settings'

def test_run_cli_command(self):
execute_response = 'Success'
self._init_global_admin(execute_response=execute_response)
ret = cli.CLI(self._global_admin).run_command(self._cli_command)
self._global_admin.execute.assert_called_once_with('', 'debugCmd', self._cli_command)
self.assertEqual(ret, execute_response)
41 changes: 41 additions & 0 deletions tests/ut/test_core_servers.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,25 @@
# pylint: disable=protected-access
from unittest import mock

from cterasdk.common import Object
from cterasdk.core import servers
from tests.ut import base_core


class TestCoreServers(base_core.BaseCoreTest):

def setUp(self):
super().setUp()
self._server = 'ctera'
self._task_id = 12345
self._task_name = 'Zones Synchronizer'
self._task_start_time = '2022-05-06T10:42:00'
self._task_end_time = self._task_start_time
self._task_elapsed_time = 12345
self._task_status = 'success'
self._task_message = 'Updated 12345 templates successfully'
self._task_ref = f'servers/{self._server}/bgTasks/{self._task_id}'

def test_list_servers_default_attrs(self):
with mock.patch("cterasdk.core.servers.query.iterator") as query_iterator_mock:
servers.Servers(self._global_admin).list_servers()
Expand All @@ -15,3 +28,31 @@ def test_list_servers_default_attrs(self):
start_from=0, count_limit=50)
actual_query_params = query_iterator_mock.call_args[0][2]
self._assert_equal_objects(actual_query_params, expected_query_params)

def test_get_server_background_tasks(self):
self._init_global_admin(get_response=[TestCoreServers._create_task_object(id=self._task_id,
name=self._task_name,
startTime=self._task_start_time,
endTime=self._task_end_time,
elapsedTime=self._task_elapsed_time,
status=self._task_status,
progstring=self._task_message
)])
ret = servers.Servers(self._global_admin).tasks.background(self._server)
self._global_admin.get.assert_called_once_with(f'/servers/{self._server}/bgTasks')
self.assertEqual(ret[0].ref, self._task_ref)

def test_get_server_scheduled_tasks(self):
self._init_global_admin(get_response=[TestCoreServers._create_task_object(id=self._task_id,
name=self._task_name,
startTime=self._task_start_time
)])
servers.Servers(self._global_admin).tasks.scheduled(self._server)
self._global_admin.get.assert_called_once_with(f'/servers/{self._server}/schedTasks')

@staticmethod
def _create_task_object(**kwargs):
param = Object()
for key, value in kwargs.items():
setattr(param, key, value)
return param
4 changes: 2 additions & 2 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ commands =
deps=
-r{toxinidir}/docs/requirements.txt
doc8
whitelist_externals=
allowlist_externals=
make
commands =
doc8 {toxinidir}/docs/source
Expand All @@ -31,7 +31,7 @@ commands =
deps=
-r{toxinidir}/requirements.txt
-r{toxinidir}/ut-requirements.txt
whitelist_externals=
allowlist_externals=
mkdir
commands=
mkdir -p reports
Expand Down

0 comments on commit f638816

Please sign in to comment.