console/SWSCloudCore/controllers/tasks/server.py
2016-04-20 03:39:13 +03:00

117 lines
4.5 KiB
Python

# coding: utf-8
import json
from SWSCloudCore import models
from SWSCloudCore.controllers.containers.server import ControllerContainersServer
class ControllerTasksServer:
def __init__(self, server_id):
self.server_id = server_id
def queue_item_oldest_get(self, status=0):
"""
Вытащить самую старую задачу из всех активных
:param status:
:return:
"""
return models.Tasks.select().where(
models.Tasks.server == self.server_id,
models.Tasks.status == status
).order_by(models.Tasks.created.asc()).get()
def count(self, status=0):
return models.Tasks.select().where(
models.Tasks.server == self.server_id,
models.Tasks.status == status
).count()
def get(self, status=0):
return models.Tasks.select().where(
models.Tasks.server == self.server_id,
models.Tasks.status == status
).execute()
def update(self, task_id, status):
# get origin status
if models.Tasks.select().where(models.Tasks.id == task_id).count() == 0:
return False
controllercontainer = ControllerContainersServer()
task = self.get_item(task_id)
# container statuses:
# 0 - inactive
# 1 - active
# 2 - activation
# 3 - deactivation
# 4 - creating
# 5 - deleting
if status == 1:
if task['task'] == 'container_start':
controllercontainer.status_set(task['plain']['container_id'], 2)
if task['task'] == 'container_stop':
controllercontainer.status_set(task['plain']['container_id'], 3)
if status == 2:
if task['task'] == 'container_create':
controllercontainer.status_set(task['plain']['container_id'], 1)
if task['task'] == 'container_start':
controllercontainer.status_set(task['plain']['container_id'], 1)
if task['task'] == 'container_stop':
controllercontainer.status_set(task['plain']['container_id'], 0)
if task['task'] == 'container_restart':
controllercontainer.status_set(task['plain']['container_id'], 1)
if task['task'] == 'container_delete':
# не имеет смысла менять статус, т.к. контейнер придётся удалять
# controllercontainer.status_set(task['plain']['container_id'], 2)
ns = models.Ips.update(status=0).where(
models.Ips.ipv4 << models.Containers.select(models.Containers.ipv4).where(
models.Containers.id == task['plain']['container_id'],
models.Containers.ipv4 != ''
)
)
ns.execute()
ns = models.Ips.update(status=0).where(
models.Ips.ipv6 << models.Containers.select(models.Containers.ipv6).where(
models.Containers.id == task['plain']['container_id'],
models.Containers.ipv6 != ''
)
)
ns.execute()
# delete all container statistics
delstats = models.ContainersStatistics.delete().where(
models.ContainersStatistics.container == task['plain']['container_id']
)
delstats.execute()
# delete stats state
delstatsstate = models.ContainersStatisticsState.delete().where(
models.ContainersStatisticsState.container == task['plain']['container_id']
)
delstatsstate.execute()
delcontainer = models.Containers.delete().where(models.Containers.id == task['plain']['container_id'])
delcontainer.execute()
task = models.Tasks.update(status=status).where(models.Tasks.id == task_id)
task.execute()
return True
def get_item(self, task_id):
get_task = models.Tasks.select().where(models.Tasks.id == task_id).get()
return {
'id': get_task.id,
'datacenter': get_task.datacenter.id,
'server': get_task.server.id,
'user': get_task.user.id,
'created': get_task.created,
'task': get_task.task,
'status': get_task.status,
'plain': json.loads(get_task.plain)
}