From b62e9433c40fed02e8af4543e41bee24588f2ad9 Mon Sep 17 00:00:00 2001 From: vanzhiganov Date: Sat, 21 May 2016 16:07:10 +0300 Subject: [PATCH] 39 QEMU virtual machines --- SWSCloudCore/controllers/tasks/server.py | 140 +++++++++++++----- SWSCloudCore/controllers/vms/__init__.py | 19 ++- SWSCloudCore/controllers/vms/manage.py | 29 ++++ SWSCloudCore/controllers/vms/server.py | 27 ++++ .../templates/administrator/_layout.auth.html | 2 +- .../templates/administrator/vms/index.html | 43 ++++++ .../templates/default/vms/delete.html | 23 +++ SWSCloudCore/views/administrator/__init__.py | 17 +++ SWSCloudCore/views/vms/__init__.py | 14 +- 9 files changed, 266 insertions(+), 48 deletions(-) create mode 100644 SWSCloudCore/controllers/vms/manage.py create mode 100644 SWSCloudCore/controllers/vms/server.py create mode 100644 SWSCloudCore/templates/administrator/vms/index.html diff --git a/SWSCloudCore/controllers/tasks/server.py b/SWSCloudCore/controllers/tasks/server.py index 1f512f4..433b2be 100644 --- a/SWSCloudCore/controllers/tasks/server.py +++ b/SWSCloudCore/controllers/tasks/server.py @@ -3,6 +3,7 @@ import json from SWSCloudCore import models from SWSCloudCore.controllers.containers.server import ControllerContainersServer +from SWSCloudCore.controllers.vms.server import Controller_VMS_Server class ControllerTasksServer: @@ -37,7 +38,8 @@ class ControllerTasksServer: if models.Tasks.select().where(models.Tasks.id == task_id).count() == 0: return False - controllercontainer = ControllerContainersServer() + controller_vm = Controller_VMS_Server() + controller_container = ControllerContainersServer() task = self.get_item(task_id) # container statuses: @@ -48,55 +50,113 @@ class ControllerTasksServer: # 4 - creating # 5 - deleting + lxc_tasks_list = ['container_start', 'container_stop', 'container_create', + 'container_restart', 'container_delete'] + qemu_tasks_list = ['vm_create', 'vm_start', 'vm_stop', 'vm_restart', 'vm_delete'] + 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 task['task'] in lxc_tasks_list: + if task['task'] == 'container_start': + controller_container.status_set(task['plain']['container_id'], 2) + if task['task'] == 'container_stop': + controller_container.status_set(task['plain']['container_id'], 3) + + if task['task'] in qemu_tasks_list: + if task['task'] == 'vm_start': + controller_vm.status_set(task['plain']['vm_id'], 2) + if task['task'] == 'vm_stop': + controller_vm.status_set(task['plain']['vm_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) + if task['task'] in qemu_tasks_list: + if task['task'] == 'vm_create': + controller_vm.status_set(task['plain']['vm_id'], 1) + if task['task'] == 'vm_start': + controller_vm.status_set(task['plain']['vm_id'], 1) + if task['task'] == 'vm_stop': + controller_vm.status_set(task['plain']['vm_id'], 0) + if task['task'] == 'vm_restart': + controller_vm.status_set(task['plain']['vm_id'], 1) + if task['task'] == 'vm_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 = models.Ips.update(status=0).where( + models.Ips.ipv4 << models.Vms.select(models.Vms.ipv4).where( + models.Vms.id == task['plain']['vm_id'], + models.Vms.ipv4 != '' + ) ) - ) - ns.execute() + 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 = models.Ips.update(status=0).where( + models.Ips.ipv6 << models.Vms.select(models.Vms.ipv6).where( + models.Vms.id == task['plain']['vm_id'], + models.Vms.ipv6 != '' + ) ) - ) - ns.execute() + 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() + # delete all container statistics + # del_stats = models.ContainersStatistics.delete().where( + # models.ContainersStatistics.container == task['plain']['container_id'] + # ) + # del_stats.execute() + # delete stats state + # del_stats_state = models.ContainersStatisticsState.delete().where( + # models.ContainersStatisticsState.container == task['plain']['container_id'] + # ) + # del_stats_state.execute() - delcontainer = models.Containers.delete().where(models.Containers.id == task['plain']['container_id']) - delcontainer.execute() + # + del_vm = models.Vms.delete().where(models.Vms.id == task['plain']['vm_id']) + del_vm.execute() + + if task['task'] in lxc_tasks_list: + if task['task'] == 'container_create': + controller_container.status_set(task['plain']['container_id'], 1) + if task['task'] == 'container_start': + controller_container.status_set(task['plain']['container_id'], 1) + if task['task'] == 'container_stop': + controller_container.status_set(task['plain']['container_id'], 0) + if task['task'] == 'container_restart': + controller_container.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 + del_stats = models.ContainersStatistics.delete().where( + models.ContainersStatistics.container == task['plain']['container_id'] + ) + del_stats.execute() + + # delete stats state + del_stats_state = models.ContainersStatisticsState.delete().where( + models.ContainersStatisticsState.container == task['plain']['container_id'] + ) + del_stats_state.execute() + + # + del_container = models.Containers.delete().where(models.Containers.id == task['plain']['container_id']) + del_container.execute() task = models.Tasks.update(status=status).where(models.Tasks.id == task_id) task.execute() diff --git a/SWSCloudCore/controllers/vms/__init__.py b/SWSCloudCore/controllers/vms/__init__.py index 735e7c4..dd2bc42 100644 --- a/SWSCloudCore/controllers/vms/__init__.py +++ b/SWSCloudCore/controllers/vms/__init__.py @@ -36,6 +36,23 @@ class ControllerVMS(object): return True def set_status(self, vm_id, status): + """ + DEPRECATED + :param vm_id: + :param status: + :return: + """ x = Vms.update(status=status).where(Vms.id == vm_id) x.execute() - return True \ No newline at end of file + return True + + def status_set(self, vm_id, status): + """ + + :param vm_id: + :param status: + :return: + """ + x = Vms.update(status=status).where(Vms.id == vm_id) + x.execute() + return True diff --git a/SWSCloudCore/controllers/vms/manage.py b/SWSCloudCore/controllers/vms/manage.py new file mode 100644 index 0000000..8561e6c --- /dev/null +++ b/SWSCloudCore/controllers/vms/manage.py @@ -0,0 +1,29 @@ +# coding: utf-8 + +from SWSCloudCore.models import Vms + + +class ControllerVMSManage(object): + def __init__(self): + pass + + def get(self, vm_id=None): + if vm_id: + return Vms.select().where(Vms.id == vm_id).get() + return Vms.select() + + def exists(self, vm_id): + if Vms.select().where(Vms.id == vm_id).count() == 0: + return False + return True + + def status_set(self, vm_id, status): + """ + + :param vm_id: + :param status: + :return: + """ + x = Vms.update(status=status).where(Vms.id == vm_id) + x.execute() + return True diff --git a/SWSCloudCore/controllers/vms/server.py b/SWSCloudCore/controllers/vms/server.py new file mode 100644 index 0000000..4a507f3 --- /dev/null +++ b/SWSCloudCore/controllers/vms/server.py @@ -0,0 +1,27 @@ +from SWSCloudCore.models import Vms + + +class Controller_VMS_Server(object): + def __init__(self): + pass + + def get(self, vm_id=None): + if vm_id: + return Vms.select().where(Vms.id == vm_id).get() + return Vms.select() + + def exists(self, vm_id): + if Vms.select().where(Vms.id == vm_id).count() == 0: + return False + return True + + def status_set(self, vm_id, status): + """ + + :param vm_id: + :param status: + :return: + """ + x = Vms.update(status=status).where(Vms.id == vm_id) + x.execute() + return True diff --git a/SWSCloudCore/templates/administrator/_layout.auth.html b/SWSCloudCore/templates/administrator/_layout.auth.html index a729519..b7a1667 100644 --- a/SWSCloudCore/templates/administrator/_layout.auth.html +++ b/SWSCloudCore/templates/administrator/_layout.auth.html @@ -31,7 +31,7 @@
  • Services
  • Infrastructure diff --git a/SWSCloudCore/templates/administrator/vms/index.html b/SWSCloudCore/templates/administrator/vms/index.html new file mode 100644 index 0000000..072868d --- /dev/null +++ b/SWSCloudCore/templates/administrator/vms/index.html @@ -0,0 +1,43 @@ +{% extends 'administrator/_layout.auth.html' %} + +{% block title %}Virtual machines{% endblock %} + +{% block subtitle %}List{% endblock %} + +{% block content %} + Total: {{ vms|length }} + + + + + + + + + + + + + + + {% if vms|length == 0 %} + + + + {% else %} + {% for vm in vms %} + + + + + + + + + + + {% endfor %} + {% endif %} + +
    IdDatacenterServerUserIPv4IPv6Status 
    Нет ни одного виртуального сервера
    {{ vm.id }}{{ vm.datacenter.name }}{{ vm.server.hostname }}{{ vm.user.email }}{{ vm.ipv4 }}{{ vm.ipv6 }}{{ vm.status }}Edit
    +{% endblock %} diff --git a/SWSCloudCore/templates/default/vms/delete.html b/SWSCloudCore/templates/default/vms/delete.html index e69de29..6e3f468 100644 --- a/SWSCloudCore/templates/default/vms/delete.html +++ b/SWSCloudCore/templates/default/vms/delete.html @@ -0,0 +1,23 @@ +{% extends "default/_layout.html" %} + +{% block title %}Удаление виртуальной машины{% endblock %} + +{% block content %} +
    +
    +

    Удаление виртуальной машины

    +
    +
    +
    +
    +
    + +

    + Вы действительно хотите удалить виртуальной машины?
    +

    + + Отмена +
    +
    +
    +{% endblock %} diff --git a/SWSCloudCore/views/administrator/__init__.py b/SWSCloudCore/views/administrator/__init__.py index 46539f4..d52dfc1 100644 --- a/SWSCloudCore/views/administrator/__init__.py +++ b/SWSCloudCore/views/administrator/__init__.py @@ -16,6 +16,7 @@ from SWSCloudCore.controllers.administrators import ControllerAdministrators from SWSCloudCore.controllers.billing import ControllerBilling from SWSCloudCore.controllers.common import ControllerMessagesEmail from SWSCloudCore.controllers.containers.manage import ControllerManageContainers +from SWSCloudCore.controllers.vms.manage import ControllerVMSManage from SWSCloudCore.controllers.datacenters.manage import ControllerManageDatacenters from SWSCloudCore.controllers.ips.manage import ControllerManageIPs from SWSCloudCore.controllers.servers.manage import ControllerManageServer @@ -142,6 +143,22 @@ def containers(): ) +@viewAdministrator.route('/vms/') +def vms(): + # check session + if not ControllerAdministrators().check_session(): + return redirect(url_for("administrator.logout")) + # auth user + if not ControllerAdministrators().auth(session['admin_email'], session['admin_password']): + return redirect(url_for("administrator.logout")) + # формируем список правил + vms_items = ControllerVMSManage().get() + return render_template( + 'administrator/vms/index.html', + vms=vms_items + ) + + @viewAdministrator.route('/payments') def payments(): # check session diff --git a/SWSCloudCore/views/vms/__init__.py b/SWSCloudCore/views/vms/__init__.py index 90fa7af..3a2a9b4 100644 --- a/SWSCloudCore/views/vms/__init__.py +++ b/SWSCloudCore/views/vms/__init__.py @@ -192,6 +192,7 @@ def delete(vm_id): return redirect(url_for("account.logout")) # vms = ControllerVMS(session['user_id']) + tasks = ControllerTasks(session['user_id']) # check the user have a selected rule # if user not have a container then redirect to the container list if not vms.exists(vm_id): @@ -204,12 +205,13 @@ def delete(vm_id): # Обновляем статус "5" для правила vms.set_status(vm_id, 5) # Создание задания - ControllerTasks(session['user_id']).create( - vm_details.datacenter.id, - vm_details.server.id, - 'vm_delete', - 0, - vm_id=vm_id + tasks.create( + datacenter_id=vm_details.datacenter.id, + server_id=vm_details.server.id, + task='vm_delete', + status=0, + vm_id=vm_id, + # hostname=vm_details.hostname ) # TODO: send email container was deleted about # Редиректим на страницу со всеми правилами