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")
|
||||
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,
|
||||
|
@ -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)
|
||||
|
@ -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):
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
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>
|
||||
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>
|
@ -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>
|
||||
|
||||
|
@ -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">
|
||||
|
@ -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>
|
||||
|
@ -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 }} |
|
||||
|
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