diff --git a/dash/image/views.py b/dash/image/views.py index 82c8ca3..591c2ac 100644 --- a/dash/image/views.py +++ b/dash/image/views.py @@ -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, diff --git a/dash/main/views.py b/dash/main/views.py index 2f394ec..d60444f 100644 --- a/dash/main/views.py +++ b/dash/main/views.py @@ -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) diff --git a/dash/models.py b/dash/models.py index 13fa412..a424048 100644 --- a/dash/models.py +++ b/dash/models.py @@ -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): diff --git a/dash/network/views.py b/dash/network/views.py index 67a5a25..b0db07e 100644 --- a/dash/network/views.py +++ b/dash/network/views.py @@ -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/') +@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/', 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, diff --git a/dash/server/views.py b/dash/server/views.py index e70b167..8ff2d86 100644 --- a/dash/server/views.py +++ b/dash/server/views.py @@ -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, diff --git a/dash/templates/all_providers.html b/dash/templates/all_providers.html new file mode 100644 index 0000000..a8d455e --- /dev/null +++ b/dash/templates/all_providers.html @@ -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 -%} + + +
+
+
+ +
+ + + + + + + + + + + {% for provider in providers %} + + + + + + + {% endfor %} + + + + + + + + + +
IDProviderNameAction
{{ provider.id }}{{ provider.provider }}{{ provider.name }} + Select +
IDProviderNameAction
+
+ +
+ +
+ +
+ + +{%- endblock content %} diff --git a/dash/templates/content_header.html b/dash/templates/content_header.html index dcbe3b3..1dfc2d7 100644 --- a/dash/templates/content_header.html +++ b/dash/templates/content_header.html @@ -1,8 +1,8 @@

- Dashboard - Preview page + {{ title }} + {{ block_description }}

\ No newline at end of file diff --git a/dash/templates/navbar.html b/dash/templates/navbar.html index fd01a9f..2dbcebf 100644 --- a/dash/templates/navbar.html +++ b/dash/templates/navbar.html @@ -203,19 +203,22 @@ Select Provider diff --git a/dash/templates/network/edit_subnet.html b/dash/templates/network/edit_subnet.html index c667024..6738f64 100644 --- a/dash/templates/network/edit_subnet.html +++ b/dash/templates/network/edit_subnet.html @@ -27,12 +27,8 @@ {% block content -%} - {{ subnet }}
-
- -
-
+
+ +
+
+
+
@@ -76,11 +87,13 @@ Toggle Dropdown
@@ -110,6 +127,21 @@
+
+ + + + +
+

Private Subnets

diff --git a/dash/templates/server/list_servers.html b/dash/templates/server/list_servers.html index ad62adc..17d0f6e 100644 --- a/dash/templates/server/list_servers.html +++ b/dash/templates/server/list_servers.html @@ -26,9 +26,8 @@ {%- endblock content_header %} {% block content -%} + - {{ servers }}
- {{ for_servers }}
@@ -47,7 +46,7 @@ {% for server in servers %} - {{ server.name }} - {{ server.id }} + {{ server.name }} {% for ips in server.networks['private'] %} {{ ips }} | diff --git a/migrations/versions/611ebee9c39b_.py b/migrations/versions/611ebee9c39b_.py new file mode 100644 index 0000000..b342c81 --- /dev/null +++ b/migrations/versions/611ebee9c39b_.py @@ -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 ###