New Functions for Networking
Some new networking functions.
This commit is contained in:
parent
b7137a1701
commit
fd0fcc4187
@ -28,7 +28,7 @@ def index():
|
|||||||
@requires_roles("user","admin")
|
@requires_roles("user","admin")
|
||||||
def list_images():
|
def list_images():
|
||||||
user = User.query.get_or_404(current_user.id)
|
user = User.query.get_or_404(current_user.id)
|
||||||
provider = Provider.query.get_or_404("1")
|
provider = Provider.query.get_or_404(user.selected_provider_id)
|
||||||
loader = loading.get_plugin_loader('password')
|
loader = loading.get_plugin_loader('password')
|
||||||
auth = loader.load_from_options(auth_url=provider.url,
|
auth = loader.load_from_options(auth_url=provider.url,
|
||||||
username=user.username,
|
username=user.username,
|
||||||
|
@ -38,6 +38,19 @@ def for_resellers_only():
|
|||||||
@requires_roles("user","reseller","admin")
|
@requires_roles("user","reseller","admin")
|
||||||
def select_provider(id):
|
def select_provider(id):
|
||||||
provider = Provider.query.filter_by(id=id).first()
|
provider = Provider.query.filter_by(id=id).first()
|
||||||
|
user = User.query.filter_by(id=current_user.id).first()
|
||||||
if provider:
|
if provider:
|
||||||
session['selected_provider'] = id
|
user.selected_provider_id = id
|
||||||
|
db.session.add(user)
|
||||||
|
flash('%s has been selected.' % provider.name)
|
||||||
return redirect(redirect_url())
|
return redirect(redirect_url())
|
||||||
|
|
||||||
|
@main.route('/all-providers')
|
||||||
|
@login_required
|
||||||
|
@requires_roles("user","reseller","admin")
|
||||||
|
def all_providers():
|
||||||
|
providers = Provider.query.all()
|
||||||
|
return render_template('all_providers.html',
|
||||||
|
title="All Providers",
|
||||||
|
block_description = "list of all providers",
|
||||||
|
providers=providers)
|
||||||
|
@ -37,7 +37,7 @@ class User(UserMixin, db.Model):
|
|||||||
provider_password = db.Column(db.Text(255))
|
provider_password = db.Column(db.Text(255))
|
||||||
confirmed = db.Column(db.Boolean, default=False)
|
confirmed = db.Column(db.Boolean, default=False)
|
||||||
suspended = db.Column(db.Boolean, default=False)
|
suspended = db.Column(db.Boolean, default=False)
|
||||||
selected_provider = None
|
selected_provider_id = db.Column(db.Integer, db.ForeignKey('providers.id'))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def password(self):
|
def password(self):
|
||||||
|
@ -20,6 +20,10 @@ from ..models import User, Role, Provider
|
|||||||
from ..email import send_email
|
from ..email import send_email
|
||||||
from ..decorators import requires_roles
|
from ..decorators import requires_roles
|
||||||
|
|
||||||
|
def redirect_url():
|
||||||
|
return request.args.get('next') or \
|
||||||
|
request.referrer or \
|
||||||
|
url_for('main.index')
|
||||||
|
|
||||||
@network.route('/', methods=['GET', 'POST'])
|
@network.route('/', methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
@ -32,7 +36,7 @@ def index():
|
|||||||
@requires_roles("user","admin")
|
@requires_roles("user","admin")
|
||||||
def list_ips():
|
def list_ips():
|
||||||
user = User.query.get_or_404(current_user.id)
|
user = User.query.get_or_404(current_user.id)
|
||||||
provider = Provider.query.get_or_404("1")
|
provider = Provider.query.get_or_404(user.selected_provider_id)
|
||||||
auth = identity.Password(auth_url=provider.url,
|
auth = identity.Password(auth_url=provider.url,
|
||||||
username=user.username,
|
username=user.username,
|
||||||
password=user.provider_password,
|
password=user.provider_password,
|
||||||
@ -55,12 +59,50 @@ def list_ips():
|
|||||||
floatingips=floatingips, ports=ports,
|
floatingips=floatingips, ports=ports,
|
||||||
sess=sess)
|
sess=sess)
|
||||||
|
|
||||||
|
@network.route('/get-floatingip')
|
||||||
|
@login_required
|
||||||
|
@requires_roles("user","reseller","admin")
|
||||||
|
def get_floatingip():
|
||||||
|
user = User.query.get_or_404(current_user.id)
|
||||||
|
provider = Provider.query.get_or_404(user.selected_provider_id)
|
||||||
|
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)
|
||||||
|
floating_ip = neutron.create_floatingip({'floatingip':
|
||||||
|
{'floating_network_id':'a5d278cb-0157-4dbc-90be-199dc8cc95b6'}
|
||||||
|
})
|
||||||
|
flash('Floating IP has allocated.\n %s' % floating_ip['floatingip']['floating_ip_address'])
|
||||||
|
return redirect(redirect_url())
|
||||||
|
|
||||||
|
@network.route('/release-floatingip/<id>')
|
||||||
|
@login_required
|
||||||
|
@requires_roles("user","reseller","admin")
|
||||||
|
def release_floatingip(id):
|
||||||
|
user = User.query.get_or_404(current_user.id)
|
||||||
|
provider = Provider.query.get_or_404(user.selected_provider_id)
|
||||||
|
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)
|
||||||
|
floating_ip = neutron.delete_floatingip(id)
|
||||||
|
flash('Floating IP has released.')
|
||||||
|
return redirect(redirect_url())
|
||||||
|
|
||||||
@network.route('/assign-floatingip/<id>', methods=['GET', 'POST'])
|
@network.route('/assign-floatingip/<id>', methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
@requires_roles("user","admin")
|
@requires_roles("user","admin")
|
||||||
def assign_floatingip(id):
|
def assign_floatingip(id):
|
||||||
user = User.query.get_or_404(current_user.id)
|
user = User.query.get_or_404(current_user.id)
|
||||||
provider = Provider.query.get_or_404("1")
|
provider = Provider.query.get_or_404(user.selected_provider_id)
|
||||||
auth = identity.Password(auth_url=provider.url,
|
auth = identity.Password(auth_url=provider.url,
|
||||||
username=user.username,
|
username=user.username,
|
||||||
password=user.provider_password,
|
password=user.provider_password,
|
||||||
@ -99,7 +141,7 @@ def assign_floatingip(id):
|
|||||||
@requires_roles("user","admin")
|
@requires_roles("user","admin")
|
||||||
def unassign_floatingip(id,server_id):
|
def unassign_floatingip(id,server_id):
|
||||||
user = User.query.get_or_404(current_user.id)
|
user = User.query.get_or_404(current_user.id)
|
||||||
provider = Provider.query.get_or_404("1")
|
provider = Provider.query.get_or_404(user.selected_provider_id)
|
||||||
auth = identity.Password(auth_url=provider.url,
|
auth = identity.Password(auth_url=provider.url,
|
||||||
username=user.username,
|
username=user.username,
|
||||||
password=user.provider_password,
|
password=user.provider_password,
|
||||||
@ -122,7 +164,7 @@ def unassign_floatingip(id,server_id):
|
|||||||
@requires_roles("admin")
|
@requires_roles("admin")
|
||||||
def edit_subnet(id):
|
def edit_subnet(id):
|
||||||
user = User.query.get_or_404(current_user.id)
|
user = User.query.get_or_404(current_user.id)
|
||||||
provider = Provider.query.get_or_404("1")
|
provider = Provider.query.get_or_404(user.selected_provider_id)
|
||||||
auth = identity.Password(auth_url=provider.url,
|
auth = identity.Password(auth_url=provider.url,
|
||||||
username=user.username,
|
username=user.username,
|
||||||
password=user.provider_password,
|
password=user.provider_password,
|
||||||
|
@ -28,7 +28,7 @@ def index():
|
|||||||
@requires_roles("user","admin")
|
@requires_roles("user","admin")
|
||||||
def list_servers():
|
def list_servers():
|
||||||
user = User.query.get_or_404(current_user.id)
|
user = User.query.get_or_404(current_user.id)
|
||||||
provider = Provider.query.get_or_404(flask_session['selected_provider'])
|
provider = Provider.query.get_or_404(user.selected_provider_id)
|
||||||
loader = loading.get_plugin_loader('password')
|
loader = loading.get_plugin_loader('password')
|
||||||
auth = loader.load_from_options(auth_url=provider.url,
|
auth = loader.load_from_options(auth_url=provider.url,
|
||||||
username=user.username,
|
username=user.username,
|
||||||
|
73
dash/templates/all_providers.html
Normal file
73
dash/templates/all_providers.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
{% extends "adminlte/base.html" %}
|
||||||
|
{% import "adminlte/layout.html" as layout with context %}
|
||||||
|
{% import "adminlte/widgets.html" as widgets with context %}
|
||||||
|
|
||||||
|
{% block navbar %}
|
||||||
|
|
||||||
|
{% include "navbar.html" %}
|
||||||
|
|
||||||
|
{%- endblock navbar %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block sidebar -%}
|
||||||
|
|
||||||
|
{% include 'sidebar.html' %}
|
||||||
|
|
||||||
|
{% include 'sidebar_menu.html' %}
|
||||||
|
|
||||||
|
{%- endblock sidebar %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block content_header -%}
|
||||||
|
{% include 'content_header.html' %}
|
||||||
|
{%- endblock content_header %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block content -%}
|
||||||
|
|
||||||
|
<!-- Main content -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<div class="box">
|
||||||
|
<!-- /.box-header -->
|
||||||
|
<div class="box-body">
|
||||||
|
<table id="example2" class="table table-bordered table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Provider</th>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Action</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for provider in providers %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ provider.id }}</td>
|
||||||
|
<td>{{ provider.provider }}</td>
|
||||||
|
<td>{{ provider.name }}</td>
|
||||||
|
<td>
|
||||||
|
<a href="{{ url_for('main.select_provider', id=provider.id) }}">Select</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
<tfoot>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Provider</th>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Action</th>
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!-- /.box-body -->
|
||||||
|
</div>
|
||||||
|
<!-- /.box -->
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
</div>
|
||||||
|
<!-- /.row -->
|
||||||
|
|
||||||
|
{%- endblock content %}
|
@ -1,8 +1,8 @@
|
|||||||
<h1>
|
<h1>
|
||||||
Dashboard
|
{{ title }}
|
||||||
<small>Preview page</small>
|
<small>{{ block_description }}</small>
|
||||||
</h1>
|
</h1>
|
||||||
<ol class="breadcrumb">
|
<ol class="breadcrumb">
|
||||||
<li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li>
|
<li><a href="{{ url_for('.index') }}"><i class="fa fa-dashboard"></i>Home</a></li>
|
||||||
<li>Dashboard</li>
|
<li>{{ title }}</li>
|
||||||
</ol>
|
</ol>
|
@ -203,19 +203,22 @@
|
|||||||
<span >Select Provider</span>
|
<span >Select Provider</span>
|
||||||
</a>
|
</a>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li class="header">2 Providers </li>
|
<li class="header">Chose the provider</li>
|
||||||
<li>
|
<li>
|
||||||
<div class="slimScrollDiv" style="position: relative; overflow: hidden; width: auto;"><ul class="menu" style="overflow: hidden; width: 100%;">
|
<div class="slimScrollDiv" style="position: relative; overflow: hidden; width: auto;"><ul class="menu" style="overflow: hidden; width: 100%;">
|
||||||
{% for provider in all_providers() %}
|
{% for provider in all_providers() %}
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ url_for('main.select_provider', id=provider.id) }}">
|
<a href="{{ url_for('main.select_provider', id=provider.id) }}">
|
||||||
<i class="ion ion-ios7-people info"></i> {{ provider.name }}
|
<i class="ion ion-ios7-people info"></i> {{ provider.name }}
|
||||||
|
{% if provider.id == current_user.selected_provider_id %}
|
||||||
|
- <i class="ion ion-checkmark-round danger"></i>
|
||||||
|
{% endif %}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% 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>
|
</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>
|
||||||
<li class="footer"><a href="#">View all providers</a></li>
|
<li class="footer"><a href="{{ url_for('main.all_providers') }}">View all providers</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
@ -27,12 +27,8 @@
|
|||||||
|
|
||||||
{% block content -%}
|
{% block content -%}
|
||||||
<!-- Main content -->
|
<!-- Main content -->
|
||||||
{{ subnet }}
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-9">
|
<div class="col-xs-12">
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="col-xs-3">
|
|
||||||
<div style="margin-bottom:10px;" class="btn-group">
|
<div style="margin-bottom:10px;" class="btn-group">
|
||||||
<button type="button" class="btn btn-primary">Edit</button>
|
<button type="button" class="btn btn-primary">Edit</button>
|
||||||
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
||||||
|
@ -31,6 +31,17 @@
|
|||||||
{{ ports }}
|
{{ ports }}
|
||||||
-->
|
-->
|
||||||
<!-- Main content -->
|
<!-- Main content -->
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<div style="margin-bottom:10px;" class="btn-group">
|
||||||
|
<a href="{{ url_for('network.get_floatingip') }}">
|
||||||
|
<button type="button" class="btn btn-primary">Get New Floating IP</button>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12">
|
<div class="col-xs-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
@ -76,11 +87,13 @@
|
|||||||
<span class="sr-only">Toggle Dropdown</span>
|
<span class="sr-only">Toggle Dropdown</span>
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
|
{% if not floatingip['port_id'] %}
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ url_for('network.assign_floatingip', id=floatingip['id'] ) }}">
|
<a href="{{ url_for('network.assign_floatingip', id=floatingip['id'] ) }}">
|
||||||
Reassign
|
Reassign
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
{% if floatingip['port_id'] %}
|
{% if floatingip['port_id'] %}
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ url_for('network.unassign_floatingip', id=floatingip['id'], server_id=server_id ) }}">
|
<a href="{{ url_for('network.unassign_floatingip', id=floatingip['id'], server_id=server_id ) }}">
|
||||||
@ -89,7 +102,11 @@
|
|||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
<li><a style="color:red" href="#">Release</a></li>
|
<li>
|
||||||
|
<a href="{{ url_for('network.release_floatingip', id=floatingip['id'] ) }}">
|
||||||
|
Release
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
@ -110,6 +127,21 @@
|
|||||||
</div>
|
</div>
|
||||||
<!-- /.box-body -->
|
<!-- /.box-body -->
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<div style="margin-bottom:10px;" class="btn-group">
|
||||||
|
<a href="{{ url_for('network.get_floatingip') }}">
|
||||||
|
<button type="button" class="btn btn-primary">Create New Private Subnet</button>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">Private Subnets</h3>
|
<h3 class="box-title">Private Subnets</h3>
|
||||||
|
@ -26,9 +26,8 @@
|
|||||||
{%- endblock content_header %}
|
{%- endblock content_header %}
|
||||||
|
|
||||||
{% block content -%}
|
{% block content -%}
|
||||||
|
|
||||||
<!-- Main content -->
|
<!-- Main content -->
|
||||||
{{ servers }} <hr />
|
|
||||||
{{ for_servers }} <hr />
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12">
|
<div class="col-xs-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
@ -47,7 +46,7 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
{% for server in servers %}
|
{% for server in servers %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ server.name }} - {{ server.id }} </td>
|
<td>{{ server.name }}</td>
|
||||||
<td>
|
<td>
|
||||||
{% for ips in server.networks['private'] %}
|
{% for ips in server.networks['private'] %}
|
||||||
{{ ips }} |
|
{{ ips }} |
|
||||||
|
28
migrations/versions/611ebee9c39b_.py
Normal file
28
migrations/versions/611ebee9c39b_.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
"""empty message
|
||||||
|
|
||||||
|
Revision ID: 611ebee9c39b
|
||||||
|
Revises: 48c96b4cae0c
|
||||||
|
Create Date: 2016-10-16 14:35:50.504023
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '611ebee9c39b'
|
||||||
|
down_revision = '48c96b4cae0c'
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.add_column('users', sa.Column('selected_provider_id', sa.Integer(), nullable=True))
|
||||||
|
op.create_foreign_key(None, 'users', 'providers', ['selected_provider_id'], ['id'])
|
||||||
|
### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.drop_constraint(None, 'users', type_='foreignkey')
|
||||||
|
op.drop_column('users', 'selected_provider_id')
|
||||||
|
### end Alembic commands ###
|
Loading…
x
Reference in New Issue
Block a user