add slaveswitcher to the order confirm button

This commit is contained in:
deflax 2018-04-02 11:49:32 +03:00
parent fd24153ddb
commit 5d088b7dd7
5 changed files with 94 additions and 95 deletions

View file

@ -38,8 +38,9 @@ def index():
@fresh_login_required
@admin_required
def list_orders():
AllOrders = Order.query.filter_by(status='new').all()
return render_template('admin/list_orders.html', orders=AllOrders)
NewOrders = Order.query.filter_by(status='new').all()
AcceptedOrders = Order.query.filter_by(status='accepted').all()
return render_template('admin/list_orders.html', neworders=NewOrders, oldorders=AcceptedOrders)
@admin.route("/listdeployments", methods=['GET'])
@fresh_login_required

View file

@ -28,7 +28,7 @@
</tr>
</thead>
<tbody>
{% for order in orders %}
{% for order in neworders %}
<tr>
<td data-title="User"><a href="{{ url_for('panel.dashboard', user_pid=order.user_id) }}">{{ order.owner.email }}</a></td>
<td data-title="Region">{{ order.region.description }}</td>
@ -40,6 +40,19 @@
<td data-title="Status">{{ order.status }}</td>
<td><button class="btn btn-default btn-success" onclick="window.open('{{ url_for('vmanager.vmcreate', orderid=order.pid) }}','_self');"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Confirm</button></td>
{% endfor %}
{% for order in oldorders %}
<tr>
<td data-title="User"><a href="{{ url_for('panel.dashboard', user_pid=order.user_id) }}">{{ order.owner.email }}</a></td>
<td data-title="Region">{{ order.region.description }}</td>
<td data-title="Recipe"><a href="#" title="{{ order.recipe.description }}">{{ order.recipe.templatefile }}</a></td>
<td data-title="Parameter1">{{ order.parameter1 }}</td>
<td data-title="Parameter2">{{ order.parameter2 }}</td>
<td data-title="Parameter3">{{ order.parameter3 }}</td>
<td data-title="Parameter4">{{ order.parameter4 }}</td>
<td data-title="Status">{{ order.status }}</td>
<td></td>
{% endfor %}
</tr>
</tbody>
</table>

View file

@ -4,37 +4,20 @@
{% block page_content %}
<div class="page-header">
<h1>Deploy</h1>
<h1>Deployment order #{{ order.pid }}</h1>
</div>
<div class="container-fluid">
<br />
<div class="row">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">Create Deployment</div>
<div class="panel-body">
<form method="POST" action="{{ url_for('vmanager.vmcreate') }}">
<p>
{{ form.servername.label }}<br />{{ form.servername(size=42) }}<br />
{% for error in form.servername.errors %}
<form method="POST" action="{{ url_for('vmanager.vmcreate', orderid=order.pid) }}">
<label><strong><b>{{ form.slaveswitcher.label }}</b></strong></label>
<div>{{ form.slaveswitcher }}</div>
{% for error in form.slaveswitcher.errors %}
{{ error }}<br />
{% endfor %}
</p>
<p>
{{ form.region.label }}<br /> {{ form.region }}<br />
{% for error in form.region.errors %}
{{ error }}<br />
{% endfor %}
</p>
<p>
{{ form.invite_key.label }}<br /> {{ form.invite_key }}<br />
{% for error in form.invite_key.errors %}
{{ error }}<br />
{% endfor %}
</p>
<p>
{{ form.csrf_token() }}
{{ form.submit }}
@ -43,9 +26,5 @@
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -1,20 +1,7 @@
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField, SelectField, DecimalField
from wtforms import validators, ValidationError
from wtforms.fields.html5 import EmailField
from .. import db
class CreateForm(FlaskForm):
region_choices = [(1, 'Plovdiv, Bulgaria')]
servername = StringField('Domain Name:', [validators.Regexp(message='ex.: myservice1.com, myservice2.local', regex='^[a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}\.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}\.[a-zA-Z]{2,3})$'), validators.Length(6,64)])
region = SelectField('Region:', choices=region_choices, coerce=int)
invite_key = StringField('Invite Code:', [validators.DataRequired(), validators.Length(6,35)])
def validate_invite_key(self, field):
if field.data != 'invitation1919':
raise ValidationError('Denied')
submit = SubmitField('Create')
class ActivateForm(FlaskForm):
period = SelectField('Deploy Period', choices=[(1, '1 Month'), (2, '2 Months'), (3, '3 Months'), (6, '6 Months'), (12, '1 Year'), (24, '2 Years')], coerce=int)

View file

@ -3,10 +3,10 @@ from flask_login import login_required, login_user, logout_user, current_user
from flask_sqlalchemy import get_debug_queries
from . import vmanager
from .forms import CreateForm, ActivateForm
from .forms import ActivateForm
from .. import db, csrf
from ..email import send_email
from ..models import User, Permission, Transaction, Deployment, PubVLAN, Service, Region, Server, Address, Domain, contact_proxmaster
from ..models import User, Permission, Transaction, Order, Deployment, PubVLAN, Service, Region, Server, Address, Domain, contact_proxmaster
from ..decorators import admin_required, permission_required
import json
@ -53,12 +53,27 @@ def slavetables():
@login_required
@admin_required
def vmcreate(orderid):
form = CreateForm()
if form.validate_on_submit():
#selects the chosen region
selected_region = Region.query.filter_by(pid=int(form.region.data)).first()
from flask_wtf import FlaskForm
from wtforms import validators, RadioField, SubmitField
#create new machine...
order = Order.query.filter_by(pid=int(orderid)).first()
if order == None:
abort(403)
servers = Server.query.filter_by(region_id=int(order.region_id)).all()
serverchoices = []
for server in servers:
serverchoice = (str(server.pid), str(server.name))
serverchoices.append(serverchoice)
#TODO: check api for happiness and preselect suggested slave
happyslave = '2' #warrior in our case
class SlaveForm(FlaskForm):
slaveswitcher = RadioField('Select Slave Server', [validators.Required()], choices=serverchoices, default=happyslave)
submit = SubmitField('Create')
form = SlaveForm()
if form.validate_on_submit():
data = { 'clientid': str(current_user.pid),
'clientemail': str(current_user.email),
'hostname': 'c' + str(current_user.pid) + '-' + str(form.servername.data),
@ -80,17 +95,63 @@ def vmcreate(orderid):
deployment = Deployment(user_id=int(current_user.pid), machine_alias=str(form.servername.data), period=1, machine_id=query['unit_id'], machine_cpu=data['cpu'], machine_mem=data['mem'], machine_hdd=data['hdd'], enabled=True, protected=False, daysleft=15, warning=True, discount=0, server_id=int(selected_slave.pid))
db.session.add(deployment)
db.session.commit()
new_vlan = PubVLAN(deploy_id=int(deployment.pid), vlan_id=int(query['vlanid']))
db.session.add(new_vlan)
db.session.commit()
order.status = 'accepted'
db.session.update(order)
db.session.commit()
flash('A new deployment is created successfully in region "{}".'.format(str(selected_region.description)))
return redirect(url_for('panel.dashboard'))
else:
flash('Deployment could not be created! Please try again later...')
return redirect(url_for('panel.dashboard'))
return render_template('vmanager/create.html', form=form)
return render_template('vmanager/create.html', form=form, order=order)
@vmanager.route('/vmremove/<int:unit_id>', methods=['GET', 'POST'])
@login_required
@admin_required
def remove(unit_id=0):
data = { 'unit_id': int(unit_id),
'type': 'kvm' }
deploy = Deployment.query.filter_by(machine_id=int(unit_id)).first()
if current_user.is_administrator():
if deploy.protected is not True:
try:
#pubvlans depends on deploy as foreign key so delete them first
for pubvlan in deploy.inv_pubvlans:
#clean public addr assignment
if pubvlan.pubaddr != None:
pubvlan.pubaddr.pubvlan_id = None
pubvlan.pubaddr.user_id = None
db.session.commit()
db.session.delete(pubvlan)
db.session.commit()
query = contact_proxmaster(data, 'status')
if query['status'] == 'running':
query = contact_proxmaster(data, 'stop')
flash('Machine {} force stopped'.format(unit_id))
time.sleep(7)
query = contact_proxmaster(data, 'remove')
flash('Machine {} terminated'.format(unit_id))
deploy.deleted = True
deploy.enabled = False
deploy.warning = False
db.session.commit()
except Exception as e:
current_app.logger.error(e)
flash('Cannot delete machine {}'.format(unit_id))
return redirect(url_for('admin.list_archive'))
else:
current_app.logger.warning('Deployment id:{} is protected! Cannot be removed'.format(unit_id))
else:
current_app.logger.warning('[WARNING] Unauthorized attempt to remove Deployment id:{}'.format(unit_id))
abort(404)
@vmanager.route('/activate/<int:itemid>', methods=['GET', 'POST'])
@login_required
@ -163,48 +224,6 @@ def activate(itemid=0):
return redirect(url_for('panel.dashboard'))
return render_template('vmanager/activate.html', form=form, deploy=deploy, cpu_cost=cpu_cost, mem_cost=mem_cost, hdd_cost=hdd_cost, tpm=tpm, ppm=ppm, discount=discount, total=total, currency=owner.currency)
@vmanager.route('/vmremove/<int:unit_id>', methods=['GET', 'POST'])
@login_required
@admin_required
def remove(unit_id=0):
data = { 'unit_id': int(unit_id),
'type': 'kvm' }
deploy = Deployment.query.filter_by(machine_id=int(unit_id)).first()
if current_user.is_administrator():
if deploy.protected is not True:
try:
#pubvlans depends on deploy as foreign key so delete them first
for pubvlan in deploy.inv_pubvlans:
#clean public addr assignment
if pubvlan.pubaddr != None:
pubvlan.pubaddr.pubvlan_id = None
pubvlan.pubaddr.user_id = None
db.session.commit()
db.session.delete(pubvlan)
db.session.commit()
query = contact_proxmaster(data, 'status')
if query['status'] == 'running':
query = contact_proxmaster(data, 'stop')
flash('Machine {} force stopped'.format(unit_id))
time.sleep(7)
query = contact_proxmaster(data, 'remove')
flash('Machine {} terminated'.format(unit_id))
deploy.deleted = True
deploy.enabled = False
deploy.warning = False
db.session.commit()
except Exception as e:
current_app.logger.error(e)
flash('Cannot delete machine {}'.format(unit_id))
return redirect(url_for('admin.list_archive'))
else:
current_app.logger.warning('Deployment id:{} is protected! Cannot be removed'.format(unit_id))
else:
current_app.logger.warning('[WARNING] Unauthorized attempt to remove Deployment id:{}'.format(unit_id))
abort(404)
@vmanager.route('/command/<cmd>/<int:unit_id>')
@login_required
def command(cmd=None, unit_id=0):