diff --git a/app/admin/routes.py b/app/admin/routes.py index 9fc2137..310b96c 100644 --- a/app/admin/routes.py +++ b/app/admin/routes.py @@ -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 diff --git a/app/templates/admin/list_orders.html b/app/templates/admin/list_orders.html index 2d014ef..460ff91 100644 --- a/app/templates/admin/list_orders.html +++ b/app/templates/admin/list_orders.html @@ -28,7 +28,7 @@ - {% for order in orders %} + {% for order in neworders %} {{ order.owner.email }} {{ order.region.description }} @@ -40,6 +40,19 @@ {{ order.status }} {% endfor %} + + {% for order in oldorders %} + + {{ order.owner.email }} + {{ order.region.description }} + {{ order.recipe.templatefile }} + {{ order.parameter1 }} + {{ order.parameter2 }} + {{ order.parameter3 }} + {{ order.parameter4 }} + {{ order.status }} + + {% endfor %} diff --git a/app/templates/vmanager/create.html b/app/templates/vmanager/create.html index fef247d..bb5c3df 100644 --- a/app/templates/vmanager/create.html +++ b/app/templates/vmanager/create.html @@ -4,37 +4,20 @@ {% block page_content %} -
-
-
-
-
-
Create Deployment
-
+
+
Create Deployment
+
-
-

- {{ form.servername.label }}
{{ form.servername(size=42) }}
- {% for error in form.servername.errors %} + + +

{{ form.slaveswitcher }}
+ {% for error in form.slaveswitcher.errors %} {{ error }}
{% endfor %} -

-

- {{ form.region.label }}
{{ form.region }}
- {% for error in form.region.errors %} - {{ error }}
- {% endfor %} -

-

- {{ form.invite_key.label }}
{{ form.invite_key }}
- {% for error in form.invite_key.errors %} - {{ error }}
- {% endfor %} -

{{ form.csrf_token() }} {{ form.submit }} @@ -43,9 +26,5 @@

- -
-
- {% endblock %} diff --git a/app/vmanager/forms.py b/app/vmanager/forms.py index 1acdc1d..d10aa4c 100644 --- a/app/vmanager/forms.py +++ b/app/vmanager/forms.py @@ -1,21 +1,8 @@ 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) submit = SubmitField('Activate') diff --git a/app/vmanager/routes.py b/app/vmanager/routes.py index 175cc44..8d32148 100644 --- a/app/vmanager/routes.py +++ b/app/vmanager/routes.py @@ -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/', 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/', 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/', 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//') @login_required def command(cmd=None, unit_id=0):