clearml/trains/backend_api/services/v2_5/workers.py

2390 lines
76 KiB
Python
Raw Normal View History

2019-12-30 16:34:28 +00:00
"""
workers service
Provides an API for worker machines, allowing workers to report status and get tasks for execution
"""
import enum
2020-07-04 19:52:09 +00:00
from datetime import datetime
2019-12-30 16:34:28 +00:00
2020-07-04 19:52:09 +00:00
import six
2019-12-30 16:34:28 +00:00
from dateutil.parser import parse as parse_datetime
2020-07-04 19:52:09 +00:00
from ....backend_api.session import NonStrictDataModel, Request, Response, schema_property, StringEnum
2019-12-30 16:34:28 +00:00
class MetricsCategory(NonStrictDataModel):
"""
:param name: Name of the metrics category.
:type name: str
:param metric_keys: The names of the metrics in the category.
:type metric_keys: Sequence[str]
"""
_schema = {
'properties': {
'metric_keys': {
'description': 'The names of the metrics in the category.',
'items': {'type': 'string'},
'type': ['array', 'null'],
},
'name': {
'description': 'Name of the metrics category.',
'type': ['string', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, name=None, metric_keys=None, **kwargs):
super(MetricsCategory, self).__init__(**kwargs)
self.name = name
self.metric_keys = metric_keys
@schema_property('name')
def name(self):
return self._property_name
@name.setter
def name(self, value):
if value is None:
self._property_name = None
return
self.assert_isinstance(value, "name", six.string_types)
self._property_name = value
@schema_property('metric_keys')
def metric_keys(self):
return self._property_metric_keys
@metric_keys.setter
def metric_keys(self, value):
if value is None:
self._property_metric_keys = None
return
self.assert_isinstance(value, "metric_keys", (list, tuple))
self.assert_isinstance(value, "metric_keys", six.string_types, is_array=True)
self._property_metric_keys = value
class AggregationType(StringEnum):
avg = "avg"
min = "min"
max = "max"
class StatItem(NonStrictDataModel):
"""
:param key: Name of a metric
:type key: str
:param category:
:type category: AggregationType
"""
_schema = {
'properties': {
'category': {
'oneOf': [
{'$ref': '#/definitions/aggregation_type'},
{'type': 'null'},
],
},
'key': {'description': 'Name of a metric', 'type': ['string', 'null']},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, key=None, category=None, **kwargs):
super(StatItem, self).__init__(**kwargs)
self.key = key
self.category = category
@schema_property('key')
def key(self):
return self._property_key
@key.setter
def key(self, value):
if value is None:
self._property_key = None
return
self.assert_isinstance(value, "key", six.string_types)
self._property_key = value
@schema_property('category')
def category(self):
return self._property_category
@category.setter
def category(self, value):
if value is None:
self._property_category = None
return
if isinstance(value, six.string_types):
try:
value = AggregationType(value)
except ValueError:
pass
else:
self.assert_isinstance(value, "category", enum.Enum)
self._property_category = value
class AggregationStats(NonStrictDataModel):
"""
:param aggregation:
:type aggregation: AggregationType
:param values: List of values corresponding to the dates in metric statistics
:type values: Sequence[float]
"""
_schema = {
'properties': {
'aggregation': {
'oneOf': [
{'$ref': '#/definitions/aggregation_type'},
{'type': 'null'},
],
},
'values': {
'description': 'List of values corresponding to the dates in metric statistics',
'items': {'type': 'number'},
'type': ['array', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, aggregation=None, values=None, **kwargs):
super(AggregationStats, self).__init__(**kwargs)
self.aggregation = aggregation
self.values = values
@schema_property('aggregation')
def aggregation(self):
return self._property_aggregation
@aggregation.setter
def aggregation(self, value):
if value is None:
self._property_aggregation = None
return
if isinstance(value, six.string_types):
try:
value = AggregationType(value)
except ValueError:
pass
else:
self.assert_isinstance(value, "aggregation", enum.Enum)
self._property_aggregation = value
@schema_property('values')
def values(self):
return self._property_values
@values.setter
def values(self, value):
if value is None:
self._property_values = None
return
self.assert_isinstance(value, "values", (list, tuple))
self.assert_isinstance(value, "values", six.integer_types + (float,), is_array=True)
self._property_values = value
class MetricStats(NonStrictDataModel):
"""
:param metric: Name of the metric (cpu_usage, memory_used etc.)
:type metric: str
:param variant: Name of the metric component. Set only if 'split_by_variant'
was set in the request
:type variant: str
:param dates: List of timestamps (in seconds from epoch) in the acceding order.
The timestamps are separated by the requested interval. Timestamps where no
workers activity was recorded are omitted.
:type dates: Sequence[int]
:param stats: Statistics data by type
:type stats: Sequence[AggregationStats]
"""
_schema = {
'properties': {
'dates': {
'description': 'List of timestamps (in seconds from epoch) in the acceding order. The timestamps are separated by the requested interval. Timestamps where no workers activity was recorded are omitted.',
'items': {'type': 'integer'},
'type': ['array', 'null'],
},
'metric': {
'description': 'Name of the metric (cpu_usage, memory_used etc.)',
'type': ['string', 'null'],
},
'stats': {
'description': 'Statistics data by type',
'items': {'$ref': '#/definitions/aggregation_stats'},
'type': ['array', 'null'],
},
'variant': {
'description': "Name of the metric component. Set only if 'split_by_variant' was set in the request",
'type': ['string', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, metric=None, variant=None, dates=None, stats=None, **kwargs):
super(MetricStats, self).__init__(**kwargs)
self.metric = metric
self.variant = variant
self.dates = dates
self.stats = stats
@schema_property('metric')
def metric(self):
return self._property_metric
@metric.setter
def metric(self, value):
if value is None:
self._property_metric = None
return
self.assert_isinstance(value, "metric", six.string_types)
self._property_metric = value
@schema_property('variant')
def variant(self):
return self._property_variant
@variant.setter
def variant(self, value):
if value is None:
self._property_variant = None
return
self.assert_isinstance(value, "variant", six.string_types)
self._property_variant = value
@schema_property('dates')
def dates(self):
return self._property_dates
@dates.setter
def dates(self, value):
if value is None:
self._property_dates = None
return
self.assert_isinstance(value, "dates", (list, tuple))
value = [int(v) if isinstance(v, float) and v.is_integer() else v for v in value]
self.assert_isinstance(value, "dates", six.integer_types, is_array=True)
self._property_dates = value
@schema_property('stats')
def stats(self):
return self._property_stats
@stats.setter
def stats(self, value):
if value is None:
self._property_stats = None
return
self.assert_isinstance(value, "stats", (list, tuple))
if any(isinstance(v, dict) for v in value):
value = [AggregationStats.from_dict(v) if isinstance(v, dict) else v for v in value]
else:
self.assert_isinstance(value, "stats", AggregationStats, is_array=True)
self._property_stats = value
class WorkerStats(NonStrictDataModel):
"""
:param worker: ID of the worker
:type worker: str
:param metrics: List of the metrics statistics for the worker
:type metrics: Sequence[MetricStats]
"""
_schema = {
'properties': {
'metrics': {
'description': 'List of the metrics statistics for the worker',
'items': {'$ref': '#/definitions/metric_stats'},
'type': ['array', 'null'],
},
'worker': {
'description': 'ID of the worker',
'type': ['string', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, worker=None, metrics=None, **kwargs):
super(WorkerStats, self).__init__(**kwargs)
self.worker = worker
self.metrics = metrics
@schema_property('worker')
def worker(self):
return self._property_worker
@worker.setter
def worker(self, value):
if value is None:
self._property_worker = None
return
self.assert_isinstance(value, "worker", six.string_types)
self._property_worker = value
@schema_property('metrics')
def metrics(self):
return self._property_metrics
@metrics.setter
def metrics(self, value):
if value is None:
self._property_metrics = None
return
self.assert_isinstance(value, "metrics", (list, tuple))
if any(isinstance(v, dict) for v in value):
value = [MetricStats.from_dict(v) if isinstance(v, dict) else v for v in value]
else:
self.assert_isinstance(value, "metrics", MetricStats, is_array=True)
self._property_metrics = value
class ActivitySeries(NonStrictDataModel):
"""
:param dates: List of timestamps (in seconds from epoch) in the acceding order.
The timestamps are separated by the requested interval.
:type dates: Sequence[int]
:param counts: List of worker counts corresponding to the timestamps in the
dates list. None values are returned for the dates with no workers.
:type counts: Sequence[int]
"""
_schema = {
'properties': {
'counts': {
'description': 'List of worker counts corresponding to the timestamps in the dates list. None values are returned for the dates with no workers.',
'items': {'type': 'integer'},
'type': ['array', 'null'],
},
'dates': {
'description': 'List of timestamps (in seconds from epoch) in the acceding order. The timestamps are separated by the requested interval.',
'items': {'type': 'integer'},
'type': ['array', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, dates=None, counts=None, **kwargs):
super(ActivitySeries, self).__init__(**kwargs)
self.dates = dates
self.counts = counts
@schema_property('dates')
def dates(self):
return self._property_dates
@dates.setter
def dates(self, value):
if value is None:
self._property_dates = None
return
self.assert_isinstance(value, "dates", (list, tuple))
value = [int(v) if isinstance(v, float) and v.is_integer() else v for v in value]
self.assert_isinstance(value, "dates", six.integer_types, is_array=True)
self._property_dates = value
@schema_property('counts')
def counts(self):
return self._property_counts
@counts.setter
def counts(self, value):
if value is None:
self._property_counts = None
return
self.assert_isinstance(value, "counts", (list, tuple))
value = [int(v) if isinstance(v, float) and v.is_integer() else v for v in value]
self.assert_isinstance(value, "counts", six.integer_types, is_array=True)
self._property_counts = value
class Worker(NonStrictDataModel):
"""
:param id: Worker ID
:type id: str
:param user: Associated user (under whose credentials are used by the worker
daemon)
:type user: IdNameEntry
:param company: Associated company
:type company: IdNameEntry
:param ip: IP of the worker
:type ip: str
:param register_time: Registration time
:type register_time: datetime.datetime
:param last_activity_time: Last activity time (even if an error occurred)
:type last_activity_time: datetime.datetime
:param last_report_time: Last successful report time
:type last_report_time: datetime.datetime
:param task: Task currently being run by the worker
:type task: CurrentTaskEntry
:param queue: Queue from which running task was taken
:type queue: QueueEntry
:param queues: List of queues on which the worker is listening
:type queues: Sequence[QueueEntry]
"""
_schema = {
'properties': {
'company': {
'description': 'Associated company',
'oneOf': [
{'$ref': '#/definitions/id_name_entry'},
{'type': 'null'},
],
},
'id': {'description': 'Worker ID', 'type': ['string', 'null']},
'ip': {'description': 'IP of the worker', 'type': ['string', 'null']},
'last_activity_time': {
'description': 'Last activity time (even if an error occurred)',
'format': 'date-time',
'type': ['string', 'null'],
},
'last_report_time': {
'description': 'Last successful report time',
'format': 'date-time',
'type': ['string', 'null'],
},
'queue': {
'description': 'Queue from which running task was taken',
'oneOf': [{'$ref': '#/definitions/queue_entry'}, {'type': 'null'}],
},
'queues': {
'description': 'List of queues on which the worker is listening',
'items': {'$ref': '#/definitions/queue_entry'},
'type': ['array', 'null'],
},
'register_time': {
'description': 'Registration time',
'format': 'date-time',
'type': ['string', 'null'],
},
'task': {
'description': 'Task currently being run by the worker',
'oneOf': [
{'$ref': '#/definitions/current_task_entry'},
{'type': 'null'},
],
},
'user': {
'description': 'Associated user (under whose credentials are used by the worker daemon)',
'oneOf': [
{'$ref': '#/definitions/id_name_entry'},
{'type': 'null'},
],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, id=None, user=None, company=None, ip=None, register_time=None, last_activity_time=None, last_report_time=None, task=None, queue=None, queues=None, **kwargs):
super(Worker, self).__init__(**kwargs)
self.id = id
self.user = user
self.company = company
self.ip = ip
self.register_time = register_time
self.last_activity_time = last_activity_time
self.last_report_time = last_report_time
self.task = task
self.queue = queue
self.queues = queues
@schema_property('id')
def id(self):
return self._property_id
@id.setter
def id(self, value):
if value is None:
self._property_id = None
return
self.assert_isinstance(value, "id", six.string_types)
self._property_id = value
@schema_property('user')
def user(self):
return self._property_user
@user.setter
def user(self, value):
if value is None:
self._property_user = None
return
if isinstance(value, dict):
value = IdNameEntry.from_dict(value)
else:
self.assert_isinstance(value, "user", IdNameEntry)
self._property_user = value
@schema_property('company')
def company(self):
return self._property_company
@company.setter
def company(self, value):
if value is None:
self._property_company = None
return
if isinstance(value, dict):
value = IdNameEntry.from_dict(value)
else:
self.assert_isinstance(value, "company", IdNameEntry)
self._property_company = value
@schema_property('ip')
def ip(self):
return self._property_ip
@ip.setter
def ip(self, value):
if value is None:
self._property_ip = None
return
self.assert_isinstance(value, "ip", six.string_types)
self._property_ip = value
@schema_property('register_time')
def register_time(self):
return self._property_register_time
@register_time.setter
def register_time(self, value):
if value is None:
self._property_register_time = None
return
self.assert_isinstance(value, "register_time", six.string_types + (datetime,))
if not isinstance(value, datetime):
value = parse_datetime(value)
self._property_register_time = value
@schema_property('last_activity_time')
def last_activity_time(self):
return self._property_last_activity_time
@last_activity_time.setter
def last_activity_time(self, value):
if value is None:
self._property_last_activity_time = None
return
self.assert_isinstance(value, "last_activity_time", six.string_types + (datetime,))
if not isinstance(value, datetime):
value = parse_datetime(value)
self._property_last_activity_time = value
@schema_property('last_report_time')
def last_report_time(self):
return self._property_last_report_time
@last_report_time.setter
def last_report_time(self, value):
if value is None:
self._property_last_report_time = None
return
self.assert_isinstance(value, "last_report_time", six.string_types + (datetime,))
if not isinstance(value, datetime):
value = parse_datetime(value)
self._property_last_report_time = value
@schema_property('task')
def task(self):
return self._property_task
@task.setter
def task(self, value):
if value is None:
self._property_task = None
return
if isinstance(value, dict):
value = CurrentTaskEntry.from_dict(value)
else:
self.assert_isinstance(value, "task", CurrentTaskEntry)
self._property_task = value
@schema_property('queue')
def queue(self):
return self._property_queue
@queue.setter
def queue(self, value):
if value is None:
self._property_queue = None
return
if isinstance(value, dict):
value = QueueEntry.from_dict(value)
else:
self.assert_isinstance(value, "queue", QueueEntry)
self._property_queue = value
@schema_property('queues')
def queues(self):
return self._property_queues
@queues.setter
def queues(self, value):
if value is None:
self._property_queues = None
return
self.assert_isinstance(value, "queues", (list, tuple))
if any(isinstance(v, dict) for v in value):
value = [QueueEntry.from_dict(v) if isinstance(v, dict) else v for v in value]
else:
self.assert_isinstance(value, "queues", QueueEntry, is_array=True)
self._property_queues = value
class IdNameEntry(NonStrictDataModel):
"""
:param id: Worker ID
:type id: str
:param name: Worker name
:type name: str
"""
_schema = {
'properties': {
'id': {'description': 'Worker ID', 'type': ['string', 'null']},
'name': {'description': 'Worker name', 'type': ['string', 'null']},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, id=None, name=None, **kwargs):
super(IdNameEntry, self).__init__(**kwargs)
self.id = id
self.name = name
@schema_property('id')
def id(self):
return self._property_id
@id.setter
def id(self, value):
if value is None:
self._property_id = None
return
self.assert_isinstance(value, "id", six.string_types)
self._property_id = value
@schema_property('name')
def name(self):
return self._property_name
@name.setter
def name(self, value):
if value is None:
self._property_name = None
return
self.assert_isinstance(value, "name", six.string_types)
self._property_name = value
class CurrentTaskEntry(NonStrictDataModel):
"""
:param id: Worker ID
:type id: str
:param name: Worker name
:type name: str
:param running_time: Task running time
:type running_time: int
:param last_iteration: Last task iteration
:type last_iteration: int
"""
_schema = {
'properties': {
'id': {'description': 'Worker ID', 'type': ['string', 'null']},
'last_iteration': {
'description': 'Last task iteration',
'type': ['integer', 'null'],
},
'name': {'description': 'Worker name', 'type': ['string', 'null']},
'running_time': {
'description': 'Task running time',
'type': ['integer', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, id=None, name=None, running_time=None, last_iteration=None, **kwargs):
super(CurrentTaskEntry, self).__init__(**kwargs)
self.id = id
self.name = name
self.running_time = running_time
self.last_iteration = last_iteration
@schema_property('id')
def id(self):
return self._property_id
@id.setter
def id(self, value):
if value is None:
self._property_id = None
return
self.assert_isinstance(value, "id", six.string_types)
self._property_id = value
@schema_property('name')
def name(self):
return self._property_name
@name.setter
def name(self, value):
if value is None:
self._property_name = None
return
self.assert_isinstance(value, "name", six.string_types)
self._property_name = value
@schema_property('running_time')
def running_time(self):
return self._property_running_time
@running_time.setter
def running_time(self, value):
if value is None:
self._property_running_time = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "running_time", six.integer_types)
self._property_running_time = value
@schema_property('last_iteration')
def last_iteration(self):
return self._property_last_iteration
@last_iteration.setter
def last_iteration(self, value):
if value is None:
self._property_last_iteration = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "last_iteration", six.integer_types)
self._property_last_iteration = value
class QueueEntry(NonStrictDataModel):
"""
:param id: Worker ID
:type id: str
:param name: Worker name
:type name: str
:param next_task: Next task in the queue
:type next_task: IdNameEntry
:param num_tasks: Number of task entries in the queue
:type num_tasks: int
"""
_schema = {
'properties': {
'id': {'description': 'Worker ID', 'type': ['string', 'null']},
'name': {'description': 'Worker name', 'type': ['string', 'null']},
'next_task': {
'description': 'Next task in the queue',
'oneOf': [
{'$ref': '#/definitions/id_name_entry'},
{'type': 'null'},
],
},
'num_tasks': {
'description': 'Number of task entries in the queue',
'type': ['integer', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, id=None, name=None, next_task=None, num_tasks=None, **kwargs):
super(QueueEntry, self).__init__(**kwargs)
self.id = id
self.name = name
self.next_task = next_task
self.num_tasks = num_tasks
@schema_property('id')
def id(self):
return self._property_id
@id.setter
def id(self, value):
if value is None:
self._property_id = None
return
self.assert_isinstance(value, "id", six.string_types)
self._property_id = value
@schema_property('name')
def name(self):
return self._property_name
@name.setter
def name(self, value):
if value is None:
self._property_name = None
return
self.assert_isinstance(value, "name", six.string_types)
self._property_name = value
@schema_property('next_task')
def next_task(self):
return self._property_next_task
@next_task.setter
def next_task(self, value):
if value is None:
self._property_next_task = None
return
if isinstance(value, dict):
value = IdNameEntry.from_dict(value)
else:
self.assert_isinstance(value, "next_task", IdNameEntry)
self._property_next_task = value
@schema_property('num_tasks')
def num_tasks(self):
return self._property_num_tasks
@num_tasks.setter
def num_tasks(self, value):
if value is None:
self._property_num_tasks = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "num_tasks", six.integer_types)
self._property_num_tasks = value
class MachineStats(NonStrictDataModel):
"""
:param cpu_usage: Average CPU usage per core
:type cpu_usage: Sequence[float]
:param gpu_usage: Average GPU usage per GPU card
:type gpu_usage: Sequence[float]
:param memory_used: Used memory MBs
:type memory_used: int
:param memory_free: Free memory MBs
:type memory_free: int
:param gpu_memory_free: GPU free memory MBs
:type gpu_memory_free: Sequence[int]
:param gpu_memory_used: GPU used memory MBs
:type gpu_memory_used: Sequence[int]
:param network_tx: Mbytes per second
:type network_tx: int
:param network_rx: Mbytes per second
:type network_rx: int
:param disk_free_home: Mbytes free space of /home drive
:type disk_free_home: int
:param disk_free_temp: Mbytes free space of /tmp drive
:type disk_free_temp: int
:param disk_read: Mbytes read per second
:type disk_read: int
:param disk_write: Mbytes write per second
:type disk_write: int
:param cpu_temperature: CPU temperature
:type cpu_temperature: Sequence[float]
:param gpu_temperature: GPU temperature
:type gpu_temperature: Sequence[float]
"""
_schema = {
'properties': {
'cpu_temperature': {
'description': 'CPU temperature',
'items': {'type': 'number'},
'type': ['array', 'null'],
},
'cpu_usage': {
'description': 'Average CPU usage per core',
'items': {'type': 'number'},
'type': ['array', 'null'],
},
'disk_free_home': {
'description': 'Mbytes free space of /home drive',
'type': ['integer', 'null'],
},
'disk_free_temp': {
'description': 'Mbytes free space of /tmp drive',
'type': ['integer', 'null'],
},
'disk_read': {
'description': 'Mbytes read per second',
'type': ['integer', 'null'],
},
'disk_write': {
'description': 'Mbytes write per second',
'type': ['integer', 'null'],
},
'gpu_memory_free': {
'description': 'GPU free memory MBs',
'items': {'type': 'integer'},
'type': ['array', 'null'],
},
'gpu_memory_used': {
'description': 'GPU used memory MBs',
'items': {'type': 'integer'},
'type': ['array', 'null'],
},
'gpu_temperature': {
'description': 'GPU temperature',
'items': {'type': 'number'},
'type': ['array', 'null'],
},
'gpu_usage': {
'description': 'Average GPU usage per GPU card',
'items': {'type': 'number'},
'type': ['array', 'null'],
},
'memory_free': {
'description': 'Free memory MBs',
'type': ['integer', 'null'],
},
'memory_used': {
'description': 'Used memory MBs',
'type': ['integer', 'null'],
},
'network_rx': {
'description': 'Mbytes per second',
'type': ['integer', 'null'],
},
'network_tx': {
'description': 'Mbytes per second',
'type': ['integer', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, cpu_usage=None, gpu_usage=None, memory_used=None, memory_free=None, gpu_memory_free=None, gpu_memory_used=None, network_tx=None, network_rx=None, disk_free_home=None, disk_free_temp=None, disk_read=None, disk_write=None, cpu_temperature=None, gpu_temperature=None, **kwargs):
super(MachineStats, self).__init__(**kwargs)
self.cpu_usage = cpu_usage
self.gpu_usage = gpu_usage
self.memory_used = memory_used
self.memory_free = memory_free
self.gpu_memory_free = gpu_memory_free
self.gpu_memory_used = gpu_memory_used
self.network_tx = network_tx
self.network_rx = network_rx
self.disk_free_home = disk_free_home
self.disk_free_temp = disk_free_temp
self.disk_read = disk_read
self.disk_write = disk_write
self.cpu_temperature = cpu_temperature
self.gpu_temperature = gpu_temperature
@schema_property('cpu_usage')
def cpu_usage(self):
return self._property_cpu_usage
@cpu_usage.setter
def cpu_usage(self, value):
if value is None:
self._property_cpu_usage = None
return
self.assert_isinstance(value, "cpu_usage", (list, tuple))
self.assert_isinstance(value, "cpu_usage", six.integer_types + (float,), is_array=True)
self._property_cpu_usage = value
@schema_property('gpu_usage')
def gpu_usage(self):
return self._property_gpu_usage
@gpu_usage.setter
def gpu_usage(self, value):
if value is None:
self._property_gpu_usage = None
return
self.assert_isinstance(value, "gpu_usage", (list, tuple))
self.assert_isinstance(value, "gpu_usage", six.integer_types + (float,), is_array=True)
self._property_gpu_usage = value
@schema_property('memory_used')
def memory_used(self):
return self._property_memory_used
@memory_used.setter
def memory_used(self, value):
if value is None:
self._property_memory_used = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "memory_used", six.integer_types)
self._property_memory_used = value
@schema_property('memory_free')
def memory_free(self):
return self._property_memory_free
@memory_free.setter
def memory_free(self, value):
if value is None:
self._property_memory_free = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "memory_free", six.integer_types)
self._property_memory_free = value
@schema_property('gpu_memory_free')
def gpu_memory_free(self):
return self._property_gpu_memory_free
@gpu_memory_free.setter
def gpu_memory_free(self, value):
if value is None:
self._property_gpu_memory_free = None
return
self.assert_isinstance(value, "gpu_memory_free", (list, tuple))
value = [int(v) if isinstance(v, float) and v.is_integer() else v for v in value]
self.assert_isinstance(value, "gpu_memory_free", six.integer_types, is_array=True)
self._property_gpu_memory_free = value
@schema_property('gpu_memory_used')
def gpu_memory_used(self):
return self._property_gpu_memory_used
@gpu_memory_used.setter
def gpu_memory_used(self, value):
if value is None:
self._property_gpu_memory_used = None
return
self.assert_isinstance(value, "gpu_memory_used", (list, tuple))
value = [int(v) if isinstance(v, float) and v.is_integer() else v for v in value]
self.assert_isinstance(value, "gpu_memory_used", six.integer_types, is_array=True)
self._property_gpu_memory_used = value
@schema_property('network_tx')
def network_tx(self):
return self._property_network_tx
@network_tx.setter
def network_tx(self, value):
if value is None:
self._property_network_tx = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "network_tx", six.integer_types)
self._property_network_tx = value
@schema_property('network_rx')
def network_rx(self):
return self._property_network_rx
@network_rx.setter
def network_rx(self, value):
if value is None:
self._property_network_rx = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "network_rx", six.integer_types)
self._property_network_rx = value
@schema_property('disk_free_home')
def disk_free_home(self):
return self._property_disk_free_home
@disk_free_home.setter
def disk_free_home(self, value):
if value is None:
self._property_disk_free_home = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "disk_free_home", six.integer_types)
self._property_disk_free_home = value
@schema_property('disk_free_temp')
def disk_free_temp(self):
return self._property_disk_free_temp
@disk_free_temp.setter
def disk_free_temp(self, value):
if value is None:
self._property_disk_free_temp = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "disk_free_temp", six.integer_types)
self._property_disk_free_temp = value
@schema_property('disk_read')
def disk_read(self):
return self._property_disk_read
@disk_read.setter
def disk_read(self, value):
if value is None:
self._property_disk_read = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "disk_read", six.integer_types)
self._property_disk_read = value
@schema_property('disk_write')
def disk_write(self):
return self._property_disk_write
@disk_write.setter
def disk_write(self, value):
if value is None:
self._property_disk_write = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "disk_write", six.integer_types)
self._property_disk_write = value
@schema_property('cpu_temperature')
def cpu_temperature(self):
return self._property_cpu_temperature
@cpu_temperature.setter
def cpu_temperature(self, value):
if value is None:
self._property_cpu_temperature = None
return
self.assert_isinstance(value, "cpu_temperature", (list, tuple))
self.assert_isinstance(value, "cpu_temperature", six.integer_types + (float,), is_array=True)
self._property_cpu_temperature = value
@schema_property('gpu_temperature')
def gpu_temperature(self):
return self._property_gpu_temperature
@gpu_temperature.setter
def gpu_temperature(self, value):
if value is None:
self._property_gpu_temperature = None
return
self.assert_isinstance(value, "gpu_temperature", (list, tuple))
self.assert_isinstance(value, "gpu_temperature", six.integer_types + (float,), is_array=True)
self._property_gpu_temperature = value
class GetActivityReportRequest(Request):
"""
Returns count of active company workers in the selected time range.
:param from_date: Starting time (in seconds from epoch) for collecting
statistics
:type from_date: float
:param to_date: Ending time (in seconds from epoch) for collecting statistics
:type to_date: float
:param interval: Time interval in seconds for a single statistics point. The
minimal value is 1
:type interval: int
"""
_service = "workers"
_action = "get_activity_report"
_version = "2.4"
_schema = {
'definitions': {},
'properties': {
'from_date': {
'description': 'Starting time (in seconds from epoch) for collecting statistics',
'type': 'number',
},
'interval': {
'description': 'Time interval in seconds for a single statistics point. The minimal value is 1',
'type': 'integer',
},
'to_date': {
'description': 'Ending time (in seconds from epoch) for collecting statistics',
'type': 'number',
},
},
'required': ['from_date', 'to_date', 'interval'],
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, from_date, to_date, interval, **kwargs):
super(GetActivityReportRequest, self).__init__(**kwargs)
self.from_date = from_date
self.to_date = to_date
self.interval = interval
@schema_property('from_date')
def from_date(self):
return self._property_from_date
@from_date.setter
def from_date(self, value):
if value is None:
self._property_from_date = None
return
self.assert_isinstance(value, "from_date", six.integer_types + (float,))
self._property_from_date = value
@schema_property('to_date')
def to_date(self):
return self._property_to_date
@to_date.setter
def to_date(self, value):
if value is None:
self._property_to_date = None
return
self.assert_isinstance(value, "to_date", six.integer_types + (float,))
self._property_to_date = value
@schema_property('interval')
def interval(self):
return self._property_interval
@interval.setter
def interval(self, value):
if value is None:
self._property_interval = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "interval", six.integer_types)
self._property_interval = value
class GetActivityReportResponse(Response):
"""
Response of workers.get_activity_report endpoint.
:param total: Activity series that include all the workers that sent reports in
the given time interval.
:type total: ActivitySeries
:param active: Activity series that include only workers that worked on a task
in the given time interval.
:type active: ActivitySeries
"""
_service = "workers"
_action = "get_activity_report"
_version = "2.4"
_schema = {
'definitions': {
'activity_series': {
'properties': {
'counts': {
'description': 'List of worker counts corresponding to the timestamps in the dates list. None values are returned for the dates with no workers.',
'items': {'type': 'integer'},
'type': ['array', 'null'],
},
'dates': {
'description': 'List of timestamps (in seconds from epoch) in the acceding order. The timestamps are separated by the requested interval.',
'items': {'type': 'integer'},
'type': ['array', 'null'],
},
},
'type': 'object',
},
},
'properties': {
'active': {
'description': 'Activity series that include only workers that worked on a task in the given time interval.',
'oneOf': [
{'$ref': '#/definitions/activity_series'},
{'type': 'null'},
],
},
'total': {
'description': 'Activity series that include all the workers that sent reports in the given time interval.',
'oneOf': [
{'$ref': '#/definitions/activity_series'},
{'type': 'null'},
],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, total=None, active=None, **kwargs):
super(GetActivityReportResponse, self).__init__(**kwargs)
self.total = total
self.active = active
@schema_property('total')
def total(self):
return self._property_total
@total.setter
def total(self, value):
if value is None:
self._property_total = None
return
if isinstance(value, dict):
value = ActivitySeries.from_dict(value)
else:
self.assert_isinstance(value, "total", ActivitySeries)
self._property_total = value
@schema_property('active')
def active(self):
return self._property_active
@active.setter
def active(self, value):
if value is None:
self._property_active = None
return
if isinstance(value, dict):
value = ActivitySeries.from_dict(value)
else:
self.assert_isinstance(value, "active", ActivitySeries)
self._property_active = value
class GetAllRequest(Request):
"""
Returns information on all registered workers.
:param last_seen: Filter out workers not active for more than last_seen
seconds. A value or 0 or 'none' will disable the filter.
:type last_seen: int
"""
_service = "workers"
_action = "get_all"
_version = "2.4"
_schema = {
'definitions': {},
'properties': {
'last_seen': {
'default': 3600,
'description': "Filter out workers not active for more than last_seen seconds.\n A value or 0 or 'none' will disable the filter.",
'type': ['integer', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, last_seen=3600, **kwargs):
super(GetAllRequest, self).__init__(**kwargs)
self.last_seen = last_seen
@schema_property('last_seen')
def last_seen(self):
return self._property_last_seen
@last_seen.setter
def last_seen(self, value):
if value is None:
self._property_last_seen = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "last_seen", six.integer_types)
self._property_last_seen = value
class GetAllResponse(Response):
"""
Response of workers.get_all endpoint.
:param workers:
:type workers: Sequence[Worker]
"""
_service = "workers"
_action = "get_all"
_version = "2.4"
_schema = {
'definitions': {
'current_task_entry': {
'properties': {
'id': {'description': 'Worker ID', 'type': ['string', 'null']},
'last_iteration': {
'description': 'Last task iteration',
'type': ['integer', 'null'],
},
'name': {
'description': 'Worker name',
'type': ['string', 'null'],
},
'running_time': {
'description': 'Task running time',
'type': ['integer', 'null'],
},
},
'type': 'object',
},
'id_name_entry': {
'properties': {
'id': {'description': 'Worker ID', 'type': ['string', 'null']},
'name': {
'description': 'Worker name',
'type': ['string', 'null'],
},
},
'type': 'object',
},
'queue_entry': {
'properties': {
'id': {'description': 'Worker ID', 'type': ['string', 'null']},
'name': {
'description': 'Worker name',
'type': ['string', 'null'],
},
'next_task': {
'description': 'Next task in the queue',
'oneOf': [
{'$ref': '#/definitions/id_name_entry'},
{'type': 'null'},
],
},
'num_tasks': {
'description': 'Number of task entries in the queue',
'type': ['integer', 'null'],
},
},
'type': 'object',
},
'worker': {
'properties': {
'company': {
'description': 'Associated company',
'oneOf': [
{'$ref': '#/definitions/id_name_entry'},
{'type': 'null'},
],
},
'id': {'description': 'Worker ID', 'type': ['string', 'null']},
'ip': {
'description': 'IP of the worker',
'type': ['string', 'null'],
},
'last_activity_time': {
'description': 'Last activity time (even if an error occurred)',
'format': 'date-time',
'type': ['string', 'null'],
},
'last_report_time': {
'description': 'Last successful report time',
'format': 'date-time',
'type': ['string', 'null'],
},
'queue': {
'description': 'Queue from which running task was taken',
'oneOf': [
{'$ref': '#/definitions/queue_entry'},
{'type': 'null'},
],
},
'queues': {
'description': 'List of queues on which the worker is listening',
'items': {'$ref': '#/definitions/queue_entry'},
'type': ['array', 'null'],
},
'register_time': {
'description': 'Registration time',
'format': 'date-time',
'type': ['string', 'null'],
},
'task': {
'description': 'Task currently being run by the worker',
'oneOf': [
{'$ref': '#/definitions/current_task_entry'},
{'type': 'null'},
],
},
'user': {
'description': 'Associated user (under whose credentials are used by the worker daemon)',
'oneOf': [
{'$ref': '#/definitions/id_name_entry'},
{'type': 'null'},
],
},
},
'type': 'object',
},
},
'properties': {
'workers': {
'items': {'$ref': '#/definitions/worker'},
'type': ['array', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, workers=None, **kwargs):
super(GetAllResponse, self).__init__(**kwargs)
self.workers = workers
@schema_property('workers')
def workers(self):
return self._property_workers
@workers.setter
def workers(self, value):
if value is None:
self._property_workers = None
return
self.assert_isinstance(value, "workers", (list, tuple))
if any(isinstance(v, dict) for v in value):
value = [Worker.from_dict(v) if isinstance(v, dict) else v for v in value]
else:
self.assert_isinstance(value, "workers", Worker, is_array=True)
self._property_workers = value
class GetMetricKeysRequest(Request):
"""
Returns worker statistics metric keys grouped by categories.
:param worker_ids: List of worker ids to collect metrics for. If not provided
or empty then all the company workers metrics are analyzed.
:type worker_ids: Sequence[str]
"""
_service = "workers"
_action = "get_metric_keys"
_version = "2.4"
_schema = {
'definitions': {},
'properties': {
'worker_ids': {
'description': 'List of worker ids to collect metrics for. If not provided or empty then all the company workers metrics are analyzed.',
'items': {'type': 'string'},
'type': ['array', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, worker_ids=None, **kwargs):
super(GetMetricKeysRequest, self).__init__(**kwargs)
self.worker_ids = worker_ids
@schema_property('worker_ids')
def worker_ids(self):
return self._property_worker_ids
@worker_ids.setter
def worker_ids(self, value):
if value is None:
self._property_worker_ids = None
return
self.assert_isinstance(value, "worker_ids", (list, tuple))
self.assert_isinstance(value, "worker_ids", six.string_types, is_array=True)
self._property_worker_ids = value
class GetMetricKeysResponse(Response):
"""
Response of workers.get_metric_keys endpoint.
:param categories: List of unique metric categories found in the statistics of
the requested workers.
:type categories: Sequence[MetricsCategory]
"""
_service = "workers"
_action = "get_metric_keys"
_version = "2.4"
_schema = {
'definitions': {
'metrics_category': {
'properties': {
'metric_keys': {
'description': 'The names of the metrics in the category.',
'items': {'type': 'string'},
'type': ['array', 'null'],
},
'name': {
'description': 'Name of the metrics category.',
'type': ['string', 'null'],
},
},
'type': 'object',
},
},
'properties': {
'categories': {
'description': 'List of unique metric categories found in the statistics of the requested workers.',
'items': {'$ref': '#/definitions/metrics_category'},
'type': ['array', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, categories=None, **kwargs):
super(GetMetricKeysResponse, self).__init__(**kwargs)
self.categories = categories
@schema_property('categories')
def categories(self):
return self._property_categories
@categories.setter
def categories(self, value):
if value is None:
self._property_categories = None
return
self.assert_isinstance(value, "categories", (list, tuple))
if any(isinstance(v, dict) for v in value):
value = [MetricsCategory.from_dict(v) if isinstance(v, dict) else v for v in value]
else:
self.assert_isinstance(value, "categories", MetricsCategory, is_array=True)
self._property_categories = value
class GetStatsRequest(Request):
"""
Returns statistics for the selected workers and time range aggregated by date intervals.
:param worker_ids: List of worker ids to collect metrics for. If not provided
or empty then all the company workers metrics are analyzed.
:type worker_ids: Sequence[str]
:param from_date: Starting time (in seconds from epoch) for collecting
statistics
:type from_date: float
:param to_date: Ending time (in seconds from epoch) for collecting statistics
:type to_date: float
:param interval: Time interval in seconds for a single statistics point. The
minimal value is 1
:type interval: int
:param items: List of metric keys and requested statistics
:type items: Sequence[StatItem]
:param split_by_variant: If true then break statistics by hardware sub types
:type split_by_variant: bool
"""
_service = "workers"
_action = "get_stats"
_version = "2.4"
_schema = {
'definitions': {
'aggregation_type': {
'description': 'Metric aggregation type',
'enum': ['avg', 'min', 'max'],
'type': 'string',
},
'stat_item': {
'properties': {
'category': {
'oneOf': [
{'$ref': '#/definitions/aggregation_type'},
{'type': 'null'},
],
},
'key': {
'description': 'Name of a metric',
'type': ['string', 'null'],
},
},
'type': 'object',
},
},
'properties': {
'from_date': {
'description': 'Starting time (in seconds from epoch) for collecting statistics',
'type': 'number',
},
'interval': {
'description': 'Time interval in seconds for a single statistics point. The minimal value is 1',
'type': 'integer',
},
'items': {
'description': 'List of metric keys and requested statistics',
'items': {'$ref': '#/definitions/stat_item'},
'type': 'array',
},
'split_by_variant': {
'default': False,
'description': 'If true then break statistics by hardware sub types',
'type': 'boolean',
},
'to_date': {
'description': 'Ending time (in seconds from epoch) for collecting statistics',
'type': 'number',
},
'worker_ids': {
'description': 'List of worker ids to collect metrics for. If not provided or empty then all the company workers metrics are analyzed.',
'items': {'type': 'string'},
'type': ['array', 'null'],
},
},
'required': ['from_date', 'to_date', 'interval', 'items'],
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, from_date, to_date, interval, items, worker_ids=None, split_by_variant=False, **kwargs):
super(GetStatsRequest, self).__init__(**kwargs)
self.worker_ids = worker_ids
self.from_date = from_date
self.to_date = to_date
self.interval = interval
self.items = items
self.split_by_variant = split_by_variant
@schema_property('worker_ids')
def worker_ids(self):
return self._property_worker_ids
@worker_ids.setter
def worker_ids(self, value):
if value is None:
self._property_worker_ids = None
return
self.assert_isinstance(value, "worker_ids", (list, tuple))
self.assert_isinstance(value, "worker_ids", six.string_types, is_array=True)
self._property_worker_ids = value
@schema_property('from_date')
def from_date(self):
return self._property_from_date
@from_date.setter
def from_date(self, value):
if value is None:
self._property_from_date = None
return
self.assert_isinstance(value, "from_date", six.integer_types + (float,))
self._property_from_date = value
@schema_property('to_date')
def to_date(self):
return self._property_to_date
@to_date.setter
def to_date(self, value):
if value is None:
self._property_to_date = None
return
self.assert_isinstance(value, "to_date", six.integer_types + (float,))
self._property_to_date = value
@schema_property('interval')
def interval(self):
return self._property_interval
@interval.setter
def interval(self, value):
if value is None:
self._property_interval = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "interval", six.integer_types)
self._property_interval = value
@schema_property('items')
def items(self):
return self._property_items
@items.setter
def items(self, value):
if value is None:
self._property_items = None
return
self.assert_isinstance(value, "items", (list, tuple))
if any(isinstance(v, dict) for v in value):
value = [StatItem.from_dict(v) if isinstance(v, dict) else v for v in value]
else:
self.assert_isinstance(value, "items", StatItem, is_array=True)
self._property_items = value
@schema_property('split_by_variant')
def split_by_variant(self):
return self._property_split_by_variant
@split_by_variant.setter
def split_by_variant(self, value):
if value is None:
self._property_split_by_variant = None
return
self.assert_isinstance(value, "split_by_variant", (bool,))
self._property_split_by_variant = value
class GetStatsResponse(Response):
"""
Response of workers.get_stats endpoint.
:param workers: List of the requested workers with their statistics
:type workers: Sequence[WorkerStats]
"""
_service = "workers"
_action = "get_stats"
_version = "2.4"
_schema = {
'definitions': {
'aggregation_stats': {
'properties': {
'aggregation': {
'oneOf': [
{'$ref': '#/definitions/aggregation_type'},
{'type': 'null'},
],
},
'values': {
'description': 'List of values corresponding to the dates in metric statistics',
'items': {'type': 'number'},
'type': ['array', 'null'],
},
},
'type': 'object',
},
'aggregation_type': {
'description': 'Metric aggregation type',
'enum': ['avg', 'min', 'max'],
'type': 'string',
},
'metric_stats': {
'properties': {
'dates': {
'description': 'List of timestamps (in seconds from epoch) in the acceding order. The timestamps are separated by the requested interval. Timestamps where no workers activity was recorded are omitted.',
'items': {'type': 'integer'},
'type': ['array', 'null'],
},
'metric': {
'description': 'Name of the metric (cpu_usage, memory_used etc.)',
'type': ['string', 'null'],
},
'stats': {
'description': 'Statistics data by type',
'items': {'$ref': '#/definitions/aggregation_stats'},
'type': ['array', 'null'],
},
'variant': {
'description': "Name of the metric component. Set only if 'split_by_variant' was set in the request",
'type': ['string', 'null'],
},
},
'type': 'object',
},
'worker_stats': {
'properties': {
'metrics': {
'description': 'List of the metrics statistics for the worker',
'items': {'$ref': '#/definitions/metric_stats'},
'type': ['array', 'null'],
},
'worker': {
'description': 'ID of the worker',
'type': ['string', 'null'],
},
},
'type': 'object',
},
},
'properties': {
'workers': {
'description': 'List of the requested workers with their statistics',
'items': {'$ref': '#/definitions/worker_stats'},
'type': ['array', 'null'],
},
},
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, workers=None, **kwargs):
super(GetStatsResponse, self).__init__(**kwargs)
self.workers = workers
@schema_property('workers')
def workers(self):
return self._property_workers
@workers.setter
def workers(self, value):
if value is None:
self._property_workers = None
return
self.assert_isinstance(value, "workers", (list, tuple))
if any(isinstance(v, dict) for v in value):
value = [WorkerStats.from_dict(v) if isinstance(v, dict) else v for v in value]
else:
self.assert_isinstance(value, "workers", WorkerStats, is_array=True)
self._property_workers = value
class RegisterRequest(Request):
"""
Register a worker in the system. Called by the Worker Daemon.
:param worker: Worker id. Must be unique in company.
:type worker: str
:param timeout: Registration timeout in seconds. If timeout seconds have passed
since the worker's last call to register or status_report, the worker is
automatically removed from the list of registered workers.
:type timeout: int
:param queues: List of queue IDs on which the worker is listening.
:type queues: Sequence[str]
"""
_service = "workers"
_action = "register"
_version = "2.4"
_schema = {
'definitions': {},
'properties': {
'queues': {
'description': 'List of queue IDs on which the worker is listening.',
'items': {'type': 'string'},
'type': 'array',
},
'timeout': {
'default': 600,
'description': "Registration timeout in seconds. If timeout seconds have passed since the worker's last call to register or status_report, the worker is automatically removed from the list of registered workers.",
'type': 'integer',
},
'worker': {
'description': 'Worker id. Must be unique in company.',
'type': 'string',
},
},
'required': ['worker'],
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, worker, timeout=600, queues=None, **kwargs):
super(RegisterRequest, self).__init__(**kwargs)
self.worker = worker
self.timeout = timeout
self.queues = queues
@schema_property('worker')
def worker(self):
return self._property_worker
@worker.setter
def worker(self, value):
if value is None:
self._property_worker = None
return
self.assert_isinstance(value, "worker", six.string_types)
self._property_worker = value
@schema_property('timeout')
def timeout(self):
return self._property_timeout
@timeout.setter
def timeout(self, value):
if value is None:
self._property_timeout = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "timeout", six.integer_types)
self._property_timeout = value
@schema_property('queues')
def queues(self):
return self._property_queues
@queues.setter
def queues(self, value):
if value is None:
self._property_queues = None
return
self.assert_isinstance(value, "queues", (list, tuple))
self.assert_isinstance(value, "queues", six.string_types, is_array=True)
self._property_queues = value
class RegisterResponse(Response):
"""
Response of workers.register endpoint.
"""
_service = "workers"
_action = "register"
_version = "2.4"
_schema = {'definitions': {}, 'properties': {}, 'type': 'object'}
class StatusReportRequest(Request):
"""
Called periodically by the worker daemon to report machine status
:param worker: Worker id.
:type worker: str
:param task: ID of a task currently being run by the worker. If no task is
sent, the worker's task field will be cleared.
:type task: str
:param queue: ID of the queue from which task was received. If no queue is
sent, the worker's queue field will be cleared.
:type queue: str
:param queues: List of queue IDs on which the worker is listening. If null, the
worker's queues list will not be updated.
:type queues: Sequence[str]
:param timestamp: UNIX time in seconds since epoch.
:type timestamp: int
:param machine_stats: The machine statistics.
:type machine_stats: MachineStats
"""
_service = "workers"
_action = "status_report"
_version = "2.4"
_schema = {
'definitions': {
'machine_stats': {
'properties': {
'cpu_temperature': {
'description': 'CPU temperature',
'items': {'type': 'number'},
'type': ['array', 'null'],
},
'cpu_usage': {
'description': 'Average CPU usage per core',
'items': {'type': 'number'},
'type': ['array', 'null'],
},
'disk_free_home': {
'description': 'Mbytes free space of /home drive',
'type': ['integer', 'null'],
},
'disk_free_temp': {
'description': 'Mbytes free space of /tmp drive',
'type': ['integer', 'null'],
},
'disk_read': {
'description': 'Mbytes read per second',
'type': ['integer', 'null'],
},
'disk_write': {
'description': 'Mbytes write per second',
'type': ['integer', 'null'],
},
'gpu_memory_free': {
'description': 'GPU free memory MBs',
'items': {'type': 'integer'},
'type': ['array', 'null'],
},
'gpu_memory_used': {
'description': 'GPU used memory MBs',
'items': {'type': 'integer'},
'type': ['array', 'null'],
},
'gpu_temperature': {
'description': 'GPU temperature',
'items': {'type': 'number'},
'type': ['array', 'null'],
},
'gpu_usage': {
'description': 'Average GPU usage per GPU card',
'items': {'type': 'number'},
'type': ['array', 'null'],
},
'memory_free': {
'description': 'Free memory MBs',
'type': ['integer', 'null'],
},
'memory_used': {
'description': 'Used memory MBs',
'type': ['integer', 'null'],
},
'network_rx': {
'description': 'Mbytes per second',
'type': ['integer', 'null'],
},
'network_tx': {
'description': 'Mbytes per second',
'type': ['integer', 'null'],
},
},
'type': 'object',
},
},
'properties': {
'machine_stats': {
'$ref': '#/definitions/machine_stats',
'description': 'The machine statistics.',
},
'queue': {
'description': "ID of the queue from which task was received. If no queue is sent, the worker's queue field will be cleared.",
'type': 'string',
},
'queues': {
'description': "List of queue IDs on which the worker is listening. If null, the worker's queues list will not be updated.",
'items': {'type': 'string'},
'type': 'array',
},
'task': {
'description': "ID of a task currently being run by the worker. If no task is sent, the worker's task field will be cleared.",
'type': 'string',
},
'timestamp': {
'description': 'UNIX time in seconds since epoch.',
'type': 'integer',
},
'worker': {'description': 'Worker id.', 'type': 'string'},
},
'required': ['worker', 'timestamp'],
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, worker, timestamp, task=None, queue=None, queues=None, machine_stats=None, **kwargs):
super(StatusReportRequest, self).__init__(**kwargs)
self.worker = worker
self.task = task
self.queue = queue
self.queues = queues
self.timestamp = timestamp
self.machine_stats = machine_stats
@schema_property('worker')
def worker(self):
return self._property_worker
@worker.setter
def worker(self, value):
if value is None:
self._property_worker = None
return
self.assert_isinstance(value, "worker", six.string_types)
self._property_worker = value
@schema_property('task')
def task(self):
return self._property_task
@task.setter
def task(self, value):
if value is None:
self._property_task = None
return
self.assert_isinstance(value, "task", six.string_types)
self._property_task = value
@schema_property('queue')
def queue(self):
return self._property_queue
@queue.setter
def queue(self, value):
if value is None:
self._property_queue = None
return
self.assert_isinstance(value, "queue", six.string_types)
self._property_queue = value
@schema_property('queues')
def queues(self):
return self._property_queues
@queues.setter
def queues(self, value):
if value is None:
self._property_queues = None
return
self.assert_isinstance(value, "queues", (list, tuple))
self.assert_isinstance(value, "queues", six.string_types, is_array=True)
self._property_queues = value
@schema_property('timestamp')
def timestamp(self):
return self._property_timestamp
@timestamp.setter
def timestamp(self, value):
if value is None:
self._property_timestamp = None
return
if isinstance(value, float) and value.is_integer():
value = int(value)
self.assert_isinstance(value, "timestamp", six.integer_types)
self._property_timestamp = value
@schema_property('machine_stats')
def machine_stats(self):
return self._property_machine_stats
@machine_stats.setter
def machine_stats(self, value):
if value is None:
self._property_machine_stats = None
return
if isinstance(value, dict):
value = MachineStats.from_dict(value)
else:
self.assert_isinstance(value, "machine_stats", MachineStats)
self._property_machine_stats = value
class StatusReportResponse(Response):
"""
Response of workers.status_report endpoint.
"""
_service = "workers"
_action = "status_report"
_version = "2.4"
_schema = {'definitions': {}, 'properties': {}, 'type': 'object'}
class UnregisterRequest(Request):
"""
Unregister a worker in the system. Called by the Worker Daemon.
:param worker: Worker id. Must be unique in company.
:type worker: str
"""
_service = "workers"
_action = "unregister"
_version = "2.4"
_schema = {
'definitions': {},
'properties': {
'worker': {
'description': 'Worker id. Must be unique in company.',
'type': 'string',
},
},
'required': ['worker'],
'type': 'object',
}
2020-07-04 19:52:09 +00:00
2019-12-30 16:34:28 +00:00
def __init__(
self, worker, **kwargs):
super(UnregisterRequest, self).__init__(**kwargs)
self.worker = worker
@schema_property('worker')
def worker(self):
return self._property_worker
@worker.setter
def worker(self, value):
if value is None:
self._property_worker = None
return
self.assert_isinstance(value, "worker", six.string_types)
self._property_worker = value
class UnregisterResponse(Response):
"""
Response of workers.unregister endpoint.
"""
_service = "workers"
_action = "unregister"
_version = "2.4"
_schema = {'definitions': {}, 'properties': {}, 'type': 'object'}
response_mapping = {
GetAllRequest: GetAllResponse,
RegisterRequest: RegisterResponse,
UnregisterRequest: UnregisterResponse,
StatusReportRequest: StatusReportResponse,
GetMetricKeysRequest: GetMetricKeysResponse,
GetStatsRequest: GetStatsResponse,
GetActivityReportRequest: GetActivityReportResponse,
}