Provider Selection

Let user to chose which provider to work on.
This commit is contained in:
root 2016-09-20 01:22:24 +03:00
parent 858b094f32
commit 86933fbe9a
12 changed files with 291 additions and 163 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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..."
return "For resellers only! We mean it..."
@main.route('/select-provider/<int:id>')
@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())

View File

@ -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 '<User %r>' % self.username
return '<User %r>' % self.username, '<User %r>' % self.selected_provider
class Provider(db.Model):
__tablename__ = 'providers'

View File

@ -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 = [])
server = StringField('Server')
submit = SubmitField()

View File

@ -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/<id>', 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/<id>', 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/<id>', 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/<id>/<server_id>', 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/<id>', 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)

View File

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

View File

@ -195,6 +195,31 @@
</li>
</ul>
</li>
<!-- Provider Selection Menu -->
<li class="dropdown notifications-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="true">
<i class="fa fa-warning"></i>
<span >Select Provider</span>
</a>
<ul class="dropdown-menu">
<li class="header">2 Providers </li>
<li>
<div class="slimScrollDiv" style="position: relative; overflow: hidden; width: auto;"><ul class="menu" style="overflow: hidden; width: 100%;">
{% for provider in all_providers() %}
<li>
<a href="{{ url_for('main.select_provider', id=provider.id) }}">
<i class="ion ion-ios7-people info"></i> {{ provider.name }}
</a>
</li>
{% endfor %}
</ul><div class="slimScrollBar" style="width: 3px; position: absolute; top: 0px; opacity: 0.4; display: none; border-radius: 7px; z-index: 99; right: 1px; height: 195.122px; background: rgb(0, 0, 0);"></div><div class="slimScrollRail" style="width: 3px; height: 100%; position: absolute; top: 0px; display: none; border-radius: 7px; opacity: 0.2; z-index: 90; right: 1px; background: rgb(51, 51, 51);"></div></div>
</li>
<li class="footer"><a href="#">View all providers</a></li>
</ul>
</li>
<!-- User Account: style can be found in dropdown.less -->
<li class="dropdown user user-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
@ -206,7 +231,8 @@
<li class="user-header bg-light-blue">
<img src="{{ current_user.avatar }}" class="img-circle" alt="User Image" />
<p>
{{ current_user.full_name }} - role : {{ current_user.role.name }}
User Name: {{ current_user.full_name }} - Role : {{ current_user.role.name }} <br />
Provider : {{ session['selected_provider'] }} <br />
<small>Member since {{ current_user.created_at.strftime("%b. %Y") }}</small>
</p>
</li>

View File

@ -26,24 +26,30 @@
{%- endblock content_header %}
{% block content -%}
<script type = "text/javascript" language = "javascript">
$("#Unassign").live("click", function(){
$("#button").load($("#text").attr("href"));
return false;
});
</script>
<!--{{ subnets }}<hr />
{{ networks }} <hr />
{{ ports }}
-->
{{ server }}
<!-- Main content -->
<div class="row">
<form class="form-horizontal" action="" method="post">
{{ form.hidden_tag() }}
<input type="hidden" name="floatingip" value="{{ floatingip.floatingips[0].floating_ip_address }}">
<div class="col-xs-4">
<div class="box box-solid">
<div class="box-header with-border">
<h3 class="box-title">Floating IP Address</h3>
</div>
<div class="box-body">
<h3>
<span style="font-size: 167%;">
{{ floatingip.floatingips[0].floating_ip_address }}
</h3>
</span>
</div>
</div>
</div>
@ -53,14 +59,22 @@
<h3 class="box-title">Server</h3>
</div>
<div class="box-body">
<select name="server" class="form-control">
{% for server in servers %}
<option value="{{ server.id }}">{{ server.name }}</option>
{% endfor %}
</select>
{% if form.server.errors %}
<br />
<span class="text-red">{% for error in form.server.errors %} {{ error }} {% endfor %}</span>
{% if floatingip.floatingips[0]['port_id'] %}
<h3>
{% 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 }}
</h3>
{% else %}
<select name="server" class="form-control">
{% for server in servers %}
<option value="{{ server.id }}">{{ server.name }}</option>
{% endfor %}
</select>
{% if form.server.errors %}
<br />
<span class="text-red">{% for error in form.server.errors %} {{ error }} {% endfor %}</span>
{% endif %}
{% endif %}
</div>
</div>
@ -71,12 +85,19 @@
<h3 class="box-title">Action</h3>
</div>
<div class="box-body">
<button type="submit" name="submit" class="btn btn-primary btn-block btn-flat" value="reassign">Reassign</button>
{% if floatingip.floatingips[0]['port_id'] %}
<a type="button" class="btn btn-primary" id="button"
href="{{ url_for('network.unassign_floatingip', id=floatingip.floatingips[0]['id'], server_id=server_id ) }}">
Unassign
</a>
{% else %}
<button type="submit" class="btn btn-primary">Reassign</button>
<button class="btn btn-danger">Release</button>
{% endif %}
</div>
</div>
</div>
</form>
</div>
<!-- /.row -->
{%- endblock content %}

View File

@ -55,7 +55,9 @@
<td>{{ floatingip['floating_ip_address'] }} </td>
<td>
{% 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 %}
</td>
<td>
@ -67,15 +69,25 @@
<td>
<div style="margin-bottom:10px;" class="btn-group">
<button type="button" class="btn btn-default">
<a style="color:black" href="">Action</a>
<a style="color:black" href="#">Action</a>
</button>
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu" role="menu">
<li><a href="{{ url_for('network.assign_floatingip', id=floatingip['id']) }}">Reassign</a></li>
<li><a href="">Unassign</a></li>
<li>
<a href="{{ url_for('network.assign_floatingip', id=floatingip['id'] ) }}">
Reassign
</a>
</li>
{% if floatingip['port_id'] %}
<li>
<a href="{{ url_for('network.unassign_floatingip', id=floatingip['id'], server_id=server_id ) }}">
Unassign
</a>
</li>
{% endif %}
<li class="divider"></li>
<li><a style="color:red" href="#">Release</a></li>
</ul>