Provider Selection
Let user to chose which provider to work on.
This commit is contained in:
parent
858b094f32
commit
86933fbe9a
@ -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'
|
||||
|
@ -42,6 +42,14 @@ def create_app(config_name):
|
||||
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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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')
|
@ -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..."
|
||||
|
||||
|
||||
@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())
|
||||
|
@ -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'
|
||||
|
@ -4,10 +4,10 @@ from wtforms import StringField, PasswordField, BooleanField, SubmitField, \
|
||||
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()
|
@ -12,7 +12,7 @@ from flask_login import login_user, logout_user, login_required, \
|
||||
from flask_principal import Identity, AnonymousIdentity, \
|
||||
identity_changed
|
||||
|
||||
from .forms import AssignFloatingIP
|
||||
from .forms import AssignFloatingIP, UnAssignFloatingIP
|
||||
|
||||
from . import network
|
||||
from .. import db
|
||||
@ -20,18 +20,6 @@ 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
|
||||
@ -73,7 +61,6 @@ def list_ips():
|
||||
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,
|
||||
@ -89,15 +76,47 @@ def assign_floatingip(id):
|
||||
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,form=form,
|
||||
servers=servers,
|
||||
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")
|
||||
|
@ -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,
|
||||
|
@ -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>
|
||||
|
@ -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,6 +59,13 @@
|
||||
<h3 class="box-title">Server</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
{% 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>
|
||||
@ -62,6 +75,7 @@
|
||||
<br />
|
||||
<span class="text-red">{% for error in form.server.errors %} {{ error }} {% endfor %}</span>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</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 %}
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user