39 QEMU virtual machines

This commit is contained in:
Vyacheslav Anzhiganov 2016-05-21 16:07:10 +03:00
parent 23b7670131
commit b62e9433c4
9 changed files with 266 additions and 48 deletions

View file

@ -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()

View file

@ -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
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

View file

@ -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

View file

@ -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

View file

@ -31,7 +31,7 @@
<li>Services
<ul>
<li><a href="{{ url_for('administrator.containers') }}">Containers</a></li>
<li><a href="{{ url_for('administrator.containers') }}">VMs</a></li>
<li><a href="{{ url_for('administrator.vms') }}">VMs</a></li>
</ul>
</li>
<li>Infrastructure

View file

@ -0,0 +1,43 @@
{% extends 'administrator/_layout.auth.html' %}
{% block title %}Virtual machines{% endblock %}
{% block subtitle %}List{% endblock %}
{% block content %}
Total: {{ vms|length }}
<table class="table table-bordered">
<thead>
<tr>
<th>Id</th>
<th>Datacenter</th>
<th>Server</th>
<th>User</th>
<th>IPv4</th>
<th>IPv6</th>
<th>Status</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% if vms|length == 0 %}
<tr>
<td colspan="6">Нет ни одного виртуального сервера</td>
</tr>
{% else %}
{% for vm in vms %}
<tr>
<td>{{ vm.id }}</td>
<td>{{ vm.datacenter.name }}</td>
<td>{{ vm.server.hostname }}</td>
<td>{{ vm.user.email }}</td>
<td>{{ vm.ipv4 }}</td>
<td>{{ vm.ipv6 }}</td>
<td>{{ vm.status }}</td>
<td><a href="#">Edit</a></td>
</tr>
{% endfor %}
{% endif %}
</tbody>
</table>
{% endblock %}

View file

@ -0,0 +1,23 @@
{% extends "default/_layout.html" %}
{% block title %}Удаление виртуальной машины{% endblock %}
{% block content %}
<div class="row">
<div class="large-12 columns">
<h3>Удаление виртуальной машины</h3>
</div>
</div>
<div class="row">
<div class="large-12 columns">
<form action="{{ url_for('vms.delete', vm_id=vm.id) }}" method="post">
<input type="hidden" name="id" value="{{ vm.id }}" />
<p>
Вы действительно хотите удалить виртуальной машины?<br/>
</p>
<input type="submit" value="Удалить" class="button alert" />
<a href="{{ url_for('vms.index') }}" class="">Отмена</a>
</form>
</div>
</div>
{% endblock %}

View file

@ -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

View file

@ -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
# Редиректим на страницу со всеми правилами