New Functions for Networking

Some new networking functions.
This commit is contained in:
kelepirci 2016-10-25 23:04:59 +03:00
parent b7137a1701
commit fd0fcc4187
12 changed files with 209 additions and 23 deletions

View File

@ -28,7 +28,7 @@ def index():
@requires_roles("user","admin")
def list_images():
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')
auth = loader.load_from_options(auth_url=provider.url,
username=user.username,

View File

@ -38,6 +38,19 @@ def for_resellers_only():
@requires_roles("user","reseller","admin")
def select_provider(id):
provider = Provider.query.filter_by(id=id).first()
user = User.query.filter_by(id=current_user.id).first()
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())
@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)

View File

@ -37,7 +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
selected_provider_id = db.Column(db.Integer, db.ForeignKey('providers.id'))
@property
def password(self):

View File

@ -20,6 +20,10 @@ from ..models import User, Role, Provider
from ..email import send_email
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'])
@login_required
@ -32,7 +36,7 @@ def index():
@requires_roles("user","admin")
def list_ips():
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,
username=user.username,
password=user.provider_password,
@ -54,13 +58,51 @@ def list_ips():
networks=networks,subnets=subnets,routers=routers,
floatingips=floatingips, ports=ports,
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'])
@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")
provider = Provider.query.get_or_404(user.selected_provider_id)
auth = identity.Password(auth_url=provider.url,
username=user.username,
password=user.provider_password,
@ -99,7 +141,7 @@ def assign_floatingip(id):
@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")
provider = Provider.query.get_or_404(user.selected_provider_id)
auth = identity.Password(auth_url=provider.url,
username=user.username,
password=user.provider_password,
@ -122,7 +164,7 @@ def unassign_floatingip(id,server_id):
@requires_roles("admin")
def edit_subnet(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,
username=user.username,
password=user.provider_password,

View File

@ -28,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(flask_session['selected_provider'])
provider = Provider.query.get_or_404(user.selected_provider_id)
loader = loading.get_plugin_loader('password')
auth = loader.load_from_options(auth_url=provider.url,
username=user.username,

View 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 %}

View File

@ -1,8 +1,8 @@
<h1>
Dashboard
<small>Preview page</small>
{{ title }}
<small>{{ block_description }}</small>
</h1>
<ol class="breadcrumb">
<li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li>
<li>Dashboard</li>
<li><a href="{{ url_for('.index') }}"><i class="fa fa-dashboard"></i>Home</a></li>
<li>{{ title }}</li>
</ol>

View File

@ -203,19 +203,22 @@
<span >Select Provider</span>
</a>
<ul class="dropdown-menu">
<li class="header">2 Providers </li>
<li class="header">Chose the provider</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 }}
{% if provider.id == current_user.selected_provider_id %}
- <i class="ion ion-checkmark-round danger"></i>
{% endif %}
</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>
<li class="footer"><a href="{{ url_for('main.all_providers') }}">View all providers</a></li>
</ul>
</li>

View File

@ -27,12 +27,8 @@
{% block content -%}
<!-- Main content -->
{{ subnet }}
<div class="row">
<div class="col-xs-9">
</div>
<div class="col-xs-3">
<div class="col-xs-12">
<div style="margin-bottom:10px;" class="btn-group">
<button type="button" class="btn btn-primary">Edit</button>
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">

View File

@ -31,6 +31,17 @@
{{ ports }}
-->
<!-- 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="col-xs-12">
<div class="box">
@ -76,11 +87,13 @@
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu" role="menu">
{% if not floatingip['port_id'] %}
<li>
<a href="{{ url_for('network.assign_floatingip', id=floatingip['id'] ) }}">
Reassign
</a>
</li>
{% endif %}
{% if floatingip['port_id'] %}
<li>
<a href="{{ url_for('network.unassign_floatingip', id=floatingip['id'], server_id=server_id ) }}">
@ -89,7 +102,11 @@
</li>
{% endif %}
<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>
</div>
</td>
@ -110,6 +127,21 @@
</div>
<!-- /.box-body -->
</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-header with-border">
<h3 class="box-title">Private Subnets</h3>

View File

@ -26,9 +26,8 @@
{%- endblock content_header %}
{% block content -%}
<!-- Main content -->
{{ servers }} <hr />
{{ for_servers }} <hr />
<div class="row">
<div class="col-xs-12">
<div class="box">
@ -47,7 +46,7 @@
<tbody>
{% for server in servers %}
<tr>
<td>{{ server.name }} - {{ server.id }} </td>
<td>{{ server.name }}</td>
<td>
{% for ips in server.networks['private'] %}
{{ ips }} |

View 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 ###