diff --git a/config.py b/config.py index afb2671..57033bc 100644 --- a/config.py +++ b/config.py @@ -21,7 +21,7 @@ class DevelopmentConfig(Config): MAIL_USERNAME = os.environ.get('MAIL_USERNAME') MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \ - ('mysql://root:Polo1043@localhost/dashDev') + ('mysql+pymysql://root:Polo1043@localhost/dashDev') SQLALCHEMY_TRACK_MODIFICATIONS = True WTF_CSRF_ENABLED = True SECRET_KEY = 'you-will-never-guess' diff --git a/dash/__init__.py b/dash/__init__.py index 55da073..cbd6b3f 100644 --- a/dash/__init__.py +++ b/dash/__init__.py @@ -41,7 +41,15 @@ def create_app(config_name): login_manager.init_app(dash) Principal.init_app(dash) toolbar.init_app(dash) - + + @dash.context_processor + def my_utility_processor(): + from .models import Provider + def all_providers(): + """ returns the all providers """ + return Provider.query.all() + + return dict(all_providers=all_providers) # attach routes and custom error pages here diff --git a/dash/auth/views.py b/dash/auth/views.py index 03e177d..781fcee 100644 --- a/dash/auth/views.py +++ b/dash/auth/views.py @@ -4,7 +4,7 @@ from flask_login import login_user, logout_user, login_required, \ current_user from . import auth from .. import db -from ..models import User, Role +from ..models import User, Role, Provider from ..email import send_email from .forms import LoginForm, RegistrationForm, PasswordResetRequestForm, \ PasswordResetForm diff --git a/dash/main/forms.py b/dash/main/forms.py index 44679c4..d04911b 100644 --- a/dash/main/forms.py +++ b/dash/main/forms.py @@ -1,8 +1,10 @@ from flask_wtf import Form -from wtforms import StringField, SubmitField -from wtforms.validators import Required +from flask import flash +from wtforms import StringField, PasswordField, BooleanField, SubmitField, ValidationError +from wtforms.validators import Required, Length, Email, Regexp, EqualTo +from ..models import User, Provider, Role -class NameForm(Form): - name = StringField('What is your name?', validators=[Required()]) +class SelectProvider(Form): + provider = StringField('What is your name?', validators=[Required()]) submit = SubmitField('Submit') \ No newline at end of file diff --git a/dash/main/views.py b/dash/main/views.py index ec736c8..2f394ec 100644 --- a/dash/main/views.py +++ b/dash/main/views.py @@ -1,28 +1,43 @@ import dateutil.parser -from flask import render_template, session, redirect, url_for, current_app - -from flask_login import login_required +from flask import render_template, redirect, request, url_for, flash, \ + current_app, session +from flask_login import login_user, logout_user, login_required, \ + current_user +from flask_principal import Identity, AnonymousIdentity, \ + identity_changed from .. import db -from ..models import User +from ..models import User, Provider, Role from ..email import send_email from . import main -from .forms import NameForm +from ..decorators import requires_roles +from .forms import SelectProvider +def redirect_url(): + return request.args.get('next') or \ + request.referrer or \ + url_for('main.index') @main.route('/', methods=['GET', 'POST']) @login_required +@requires_roles("user","reseller","admin") def index(): return render_template('index.html') -@main.route('/lockscreen') -def lockscreen(): - current_user = User() - return render_template('lockscreen.html', current_user=current_user) - @main.route('/reseller') @login_required +@requires_roles("user","reseller","admin") def for_resellers_only(): - return "For resellers only! We mean it..." \ No newline at end of file + return "For resellers only! We mean it..." + + +@main.route('/select-provider/') +@login_required +@requires_roles("user","reseller","admin") +def select_provider(id): + provider = Provider.query.filter_by(id=id).first() + if provider: + session['selected_provider'] = id + return redirect(redirect_url()) diff --git a/dash/models.py b/dash/models.py index 59237c8..13fa412 100644 --- a/dash/models.py +++ b/dash/models.py @@ -37,6 +37,7 @@ class User(UserMixin, db.Model): provider_password = db.Column(db.Text(255)) confirmed = db.Column(db.Boolean, default=False) suspended = db.Column(db.Boolean, default=False) + selected_provider = None @property def password(self): @@ -107,7 +108,7 @@ class User(UserMixin, db.Model): return True def __repr__(self): - return '' % self.username + return '' % self.username, '' % self.selected_provider class Provider(db.Model): __tablename__ = 'providers' diff --git a/dash/network/forms.py b/dash/network/forms.py index 83a34cc..a805a26 100644 --- a/dash/network/forms.py +++ b/dash/network/forms.py @@ -1,13 +1,13 @@ from flask_wtf import Form from flask import flash from wtforms import StringField, PasswordField, BooleanField, SubmitField, \ - ValidationError, SelectField + ValidationError, SelectField from wtforms.validators import Required, Length, Email, Regexp, EqualTo, \ IPAddress -from ..models import User, Role, Provider - from flask_login import login_user, logout_user, login_required, \ current_user +from ..models import User, Role, Provider + from keystoneauth1 import identity from keystoneauth1 import session @@ -15,6 +15,29 @@ from neutronclient.v2_0 import client from novaclient import client as client_nova class AssignFloatingIP(Form): + server = SelectField('Server', choices=int) + + + def __init__(self, floatingip, *args, **kwargs): + user = User.query.get_or_404(current_user.id) + provider = Provider.query.get_or_404("1") + auth = identity.Password(auth_url=provider.url, + username=user.username, + password=user.provider_password, + project_name=user.username, + project_domain_name='Default', + user_domain_name='Default') + sess = session.Session(auth=auth) + nova = client_nova.Client('2', session=sess) + servers = nova.servers.list() + super(AssignFloatingIP, self).__init__(*args, **kwargs) + self.server.choices = [(server.id, server.name) + for server in servers] + + self.floatingip = floatingip + +class UnAssignFloatingIP(Form): floatingip = StringField('Floating IP', validators=[Required(), Length(1, 128), IPAddress()]) - server = SelectField('Server', choices = []) \ No newline at end of file + server = StringField('Server') + submit = SubmitField() \ No newline at end of file diff --git a/dash/network/views.py b/dash/network/views.py index 643513b..67a5a25 100644 --- a/dash/network/views.py +++ b/dash/network/views.py @@ -1,122 +1,141 @@ -import datetime, requests, json, string, random, pprint - -from keystoneauth1 import identity -from keystoneauth1 import session -from neutronclient.v2_0 import client -from novaclient import client as client_nova - - -from flask import render_template, redirect, request, url_for, flash -from flask_login import login_user, logout_user, login_required, \ - current_user -from flask_principal import Identity, AnonymousIdentity, \ - identity_changed - -from .forms import AssignFloatingIP - -from . import network -from .. import db -from ..models import User, Role, Provider -from ..email import send_email -from ..decorators import requires_roles - -def print_values(val, type): - if type == 'ports': - val_list = val['ports'] - if type == 'networks': - val_list = val['networks'] - if type == 'routers': - val_list = val['routers'] - for p in val_list: - for k, v in p.items(): - print("%s : %s" % (k, v)) - print('\n') - - -@network.route('/', methods=['GET', 'POST']) -@login_required -@requires_roles("user","admin") -def index(): - return render_template('network/index.html') - -@network.route('/list-ips', methods=['GET', 'POST']) -@login_required -@requires_roles("user","admin") -def list_ips(): - user = User.query.get_or_404(current_user.id) - provider = Provider.query.get_or_404("1") - auth = identity.Password(auth_url=provider.url, - username=user.username, - password=user.provider_password, - project_name=user.username, - project_domain_name='Default', - user_domain_name='Default') - sess = session.Session(auth=auth) - neutron = client.Client(session=sess) - nova = client_nova.Client('2', session=sess) - networks = neutron.list_networks() - subnets = neutron.list_subnets() - routers = neutron.list_routers() - floatingips = neutron.list_floatingips() - ports = neutron.list_ports() - return render_template('network/list_ips.html', - title="List Networks", - block_description = "manage all of your networks", - user=user, provider=provider,neutron=neutron,nova=nova, - networks=networks,subnets=subnets,routers=routers, - floatingips=floatingips, ports=ports, - sess=sess) - -@network.route('/assign-floatingip/', methods=['GET', 'POST']) -@login_required -@requires_roles("user","admin") -def assign_floatingip(id): - user = User.query.get_or_404(current_user.id) - provider = Provider.query.get_or_404("1") - form = AssignFloatingIP() - auth = identity.Password(auth_url=provider.url, - username=user.username, - password=user.provider_password, - project_name=user.username, - project_domain_name='Default', - user_domain_name='Default') - sess = session.Session(auth=auth) - neutron = client.Client(session=sess) - nova = client_nova.Client('2', session=sess) - servers = nova.servers.list() - networks = neutron.list_networks() - subnets = neutron.list_subnets() - routers = neutron.list_routers() - floatingip = neutron.list_floatingips(id=id) - ports = neutron.list_ports() - return render_template('network/assign_floatingip.html', - title="Assign Floating IP", - block_description = "assign floating ip to server", - user=user, provider=provider,neutron=neutron,nova=nova, - networks=networks,subnets=subnets,routers=routers, - floatingip=floatingip, ports=ports,form=form, - servers=servers, - sess=sess) - -@network.route('/edit-subnet/', methods=['GET', 'POST']) -@login_required -@requires_roles("admin") -def edit_subnet(id): - user = User.query.get_or_404(current_user.id) - provider = Provider.query.get_or_404("1") - auth = identity.Password(auth_url=provider.url, - username=user.username, - password=user.provider_password, - project_name=user.username, - project_domain_name='Default', - user_domain_name='Default') - sess = session.Session(auth=auth) - neutron = client.Client(session=sess) - nova = client_nova.Client('2', session=sess) - subnet = neutron.list_subnets(id=id) - ports = neutron.list_ports(subnet_id=id) - return render_template('network/edit_subnet.html', - title="Edit Subnet", - block_description = "edit and look subnet details", - subnet=subnet,neutron=neutron,ports=ports,nova=nova, +import datetime, requests, json, string, random, pprint + +from keystoneauth1 import identity +from keystoneauth1 import session +from neutronclient.v2_0 import client +from novaclient import client as client_nova + + +from flask import render_template, redirect, request, url_for, flash +from flask_login import login_user, logout_user, login_required, \ + current_user +from flask_principal import Identity, AnonymousIdentity, \ + identity_changed + +from .forms import AssignFloatingIP, UnAssignFloatingIP + +from . import network +from .. import db +from ..models import User, Role, Provider +from ..email import send_email +from ..decorators import requires_roles + + +@network.route('/', methods=['GET', 'POST']) +@login_required +@requires_roles("user","admin") +def index(): + return render_template('network/index.html') + +@network.route('/list-ips', methods=['GET', 'POST']) +@login_required +@requires_roles("user","admin") +def list_ips(): + user = User.query.get_or_404(current_user.id) + provider = Provider.query.get_or_404("1") + auth = identity.Password(auth_url=provider.url, + username=user.username, + password=user.provider_password, + project_name=user.username, + project_domain_name='Default', + user_domain_name='Default') + sess = session.Session(auth=auth) + neutron = client.Client(session=sess) + nova = client_nova.Client('2', session=sess) + networks = neutron.list_networks() + subnets = neutron.list_subnets() + routers = neutron.list_routers() + floatingips = neutron.list_floatingips() + ports = neutron.list_ports() + return render_template('network/list_ips.html', + title="List Networks", + block_description = "manage all of your networks", + user=user, provider=provider,neutron=neutron,nova=nova, + networks=networks,subnets=subnets,routers=routers, + floatingips=floatingips, ports=ports, + sess=sess) + +@network.route('/assign-floatingip/', methods=['GET', 'POST']) +@login_required +@requires_roles("user","admin") +def assign_floatingip(id): + user = User.query.get_or_404(current_user.id) + provider = Provider.query.get_or_404("1") + auth = identity.Password(auth_url=provider.url, + username=user.username, + password=user.provider_password, + project_name=user.username, + project_domain_name='Default', + user_domain_name='Default') + sess = session.Session(auth=auth) + neutron = client.Client(session=sess) + nova = client_nova.Client('2', session=sess) + servers = nova.servers.list() + networks = neutron.list_networks() + subnets = neutron.list_subnets() + routers = neutron.list_routers() + floatingip = neutron.list_floatingips(id=id) + ports = neutron.list_ports() + form = AssignFloatingIP(floatingip=floatingip) + if form.validate_on_submit(): + server = form.server.data + server_assign = nova.servers.get(server) + floatingip_assign = floatingip['floatingips'][0]['floating_ip_address'] + server_assign.add_floating_ip(floatingip_assign) + flash("Floating IP Assigned") + return redirect(url_for('.assign_floatingip', id=id)) + return render_template('network/assign_floatingip.html', + title="Assign Floating IP", + block_description = "assign floating ip to server", + form=form, + user=user, provider=provider,neutron=neutron,nova=nova, + networks=networks,subnets=subnets,routers=routers, + floatingip=floatingip, ports=ports, + servers=servers,id=id, + sess=sess) + +@network.route('/unassign-floatingip//', methods=['GET', 'POST']) +@login_required +@requires_roles("user","admin") +def unassign_floatingip(id,server_id): + user = User.query.get_or_404(current_user.id) + provider = Provider.query.get_or_404("1") + auth = identity.Password(auth_url=provider.url, + username=user.username, + password=user.provider_password, + project_name=user.username, + project_domain_name='Default', + user_domain_name='Default') + sess = session.Session(auth=auth) + neutron = client.Client(session=sess) + nova = client_nova.Client('2', session=sess) + floatingip = neutron.list_floatingips(id=id) + server = server_id + server_assign = nova.servers.get(server) + floatingip_assign = floatingip['floatingips'][0]['floating_ip_address'] + server_assign.remove_floating_ip(floatingip_assign) + flash("Floating IP Unassigned") + return redirect(url_for('network.assign_floatingip', id=id)) + +@network.route('/edit-subnet/', methods=['GET', 'POST']) +@login_required +@requires_roles("admin") +def edit_subnet(id): + user = User.query.get_or_404(current_user.id) + provider = Provider.query.get_or_404("1") + auth = identity.Password(auth_url=provider.url, + username=user.username, + password=user.provider_password, + project_name=user.username, + project_domain_name='Default', + user_domain_name='Default') + sess = session.Session(auth=auth) + neutron = client.Client(session=sess) + nova = client_nova.Client('2', session=sess) + subnet = neutron.list_subnets(id=id) + ports = neutron.list_ports(subnet_id=id) + return render_template('network/edit_subnet.html', + title="Edit Subnet", + block_description = "edit and look subnet details", + subnet=subnet,neutron=neutron,ports=ports,nova=nova, sess=sess) \ No newline at end of file diff --git a/dash/server/views.py b/dash/server/views.py index 70c6363..e70b167 100644 --- a/dash/server/views.py +++ b/dash/server/views.py @@ -7,6 +7,7 @@ from novaclient import client from flask import render_template, redirect, request, url_for, flash from flask_login import login_user, logout_user, login_required, \ current_user +from flask_login import session as flask_session from flask_principal import Identity, AnonymousIdentity, \ identity_changed @@ -27,7 +28,7 @@ def index(): @requires_roles("user","admin") def list_servers(): user = User.query.get_or_404(current_user.id) - provider = Provider.query.get_or_404("1") + provider = Provider.query.get_or_404(flask_session['selected_provider']) loader = loading.get_plugin_loader('password') auth = loader.load_from_options(auth_url=provider.url, username=user.username, diff --git a/dash/templates/navbar.html b/dash/templates/navbar.html index 625f709..fd01a9f 100644 --- a/dash/templates/navbar.html +++ b/dash/templates/navbar.html @@ -195,6 +195,31 @@ + + + + +
  • User Image

    - {{ current_user.full_name }} - role : {{ current_user.role.name }} + User Name: {{ current_user.full_name }} - Role : {{ current_user.role.name }}
    + Provider : {{ session['selected_provider'] }}
    Member since {{ current_user.created_at.strftime("%b. %Y") }}

  • diff --git a/dash/templates/network/assign_floatingip.html b/dash/templates/network/assign_floatingip.html index 376099c..4cdad6c 100644 --- a/dash/templates/network/assign_floatingip.html +++ b/dash/templates/network/assign_floatingip.html @@ -26,24 +26,30 @@ {%- endblock content_header %} {% block content -%} + + {{ server }}
    {{ form.hidden_tag() }} -

    Floating IP Address

    -

    + {{ floatingip.floatingips[0].floating_ip_address }} -

    +
    @@ -53,14 +59,22 @@

    Server

    - - {% if form.server.errors %} -
    - {% for error in form.server.errors %} {{ error }} {% endfor %} + {% if floatingip.floatingips[0]['port_id'] %} +

    + {% set server_name = nova.servers.get(neutron.list_ports(id=floatingip.floatingips[0]['port_id']).ports[0]['device_id']).name %} + {% set server_id = nova.servers.get(neutron.list_ports(id=floatingip.floatingips[0]['port_id']).ports[0]['device_id']).id %} + {{ server_name }} +

    + {% else %} + + {% if form.server.errors %} +
    + {% for error in form.server.errors %} {{ error }} {% endfor %} + {% endif %} {% endif %}
    @@ -71,12 +85,19 @@

    Action

    - {%- endblock content %} \ No newline at end of file diff --git a/dash/templates/network/list_ips.html b/dash/templates/network/list_ips.html index 2b98bd3..3bbf90e 100644 --- a/dash/templates/network/list_ips.html +++ b/dash/templates/network/list_ips.html @@ -55,7 +55,9 @@ {{ floatingip['floating_ip_address'] }} {% if floatingip['port_id'] %} - {{ nova.servers.get(neutron.list_ports(id=floatingip['port_id']).ports[0]['device_id']).name }} + {% set server_name = nova.servers.get(neutron.list_ports(id=floatingip['port_id']).ports[0]['device_id']).name %} + {% set server_id = nova.servers.get(neutron.list_ports(id=floatingip['port_id']).ports[0]['device_id']).id %} + {{ server_name }} {% endif %} @@ -67,15 +69,25 @@