clearml/trains/backend_api/services/v2_8/workers.py
2020-07-04 22:52:09 +03:00

2390 lines
76 KiB
Python

"""
workers service
Provides an API for worker machines, allowing workers to report status and get tasks for execution
"""
import enum
from datetime import datetime
import six
from dateutil.parser import parse as parse_datetime
from ....backend_api.session import NonStrictDataModel, Request, Response, schema_property, StringEnum
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',
}
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',
}
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',
}
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',
}
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',
}
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',
}
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',
}
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',
}
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',
}
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',
}
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',
}
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.8"
_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',
}
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.8"
_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',
}
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.8"
_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',
}
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.8"
_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',
}
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.8"
_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',
}
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.8"
_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',
}
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.8"
_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',
}
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.8"
_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',
}
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.8"
_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',
}
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.8"
_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.8"
_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',
}
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.8"
_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.8"
_schema = {
'definitions': {},
'properties': {
'worker': {
'description': 'Worker id. Must be unique in company.',
'type': 'string',
},
},
'required': ['worker'],
'type': 'object',
}
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.8"
_schema = {'definitions': {}, 'properties': {}, 'type': 'object'}
response_mapping = {
GetAllRequest: GetAllResponse,
RegisterRequest: RegisterResponse,
UnregisterRequest: UnregisterResponse,
StatusReportRequest: StatusReportResponse,
GetMetricKeysRequest: GetMetricKeysResponse,
GetStatsRequest: GetStatsResponse,
GetActivityReportRequest: GetActivityReportResponse,
}