コード例 #1
0
        # NOTE(apugachev) for big this will fail to load and BrokenPipe
        # will be raised inside Flask
        return flask.jsonify({})

    @bp.route('progress/<uploaded_filename>/')
    def progress(uploaded_filename):
        r = flask.current_app.cache.get(uploaded_filename)
        return flask.jsonify(r or {})

    @bp.route('<image_id>/delete/', methods=['POST'])
    def delete(image_id):
        image = clients.admin_clients().glance.images.get(image_id)
        owner = getattr(image, 'owner')
        if owner == clients.get_systenant_id():
            principal.Permission(('role', 'admin')).test()
        else:
            principal.Permission(('role', 'member', owner)).test()
        form = forms.DeleteForm()
        if form.validate_on_submit():
            image.delete()
            flask.flash('Image successfully deleted', 'success')
        else:
            flask.flash('Invalid form', 'error')
        return flask.redirect(flask.url_for('.index'))

    return bp


ABP = environments.admin(get_bp('global_images'))
PBP = environments.project(get_bp('project_images'))
コード例 #2
0
# You should have received a copy of the GNU Lesser General Public
# License along with this program. If not, see
# <http://www.gnu.org/licenses/>.

import flask
from flask import blueprints

from focus import clients

from focus.views import environments
from focus.views import forms
from focus.views import pagination

from openstackclient_base.exceptions import HttpException

bp = environments.admin(blueprints.Blueprint('networks', __name__))


@bp.route('')
def index():
    try:
        networks = clients.admin_clients().compute.networks.list()
    except HttpException as ex:
        networks = []
    tenants = clients.admin_clients().identity_admin.tenants.list()
    tenants = dict(((t.id, t.name) for t in tenants))
    p = pagination.Pagination(len(networks))
    offset = p.limit_offset()
    networks = [net._info for net in networks[offset[0]:offset[1]]]
    for net in networks:
        net["label"] = tenants.get(net["project_id"], net["label"])
コード例 #3
0
import urllib

import flask
from flask import blueprints
from flaskext import wtf

from focus import utils

from focus.views import environments
from focus.views import forms
from focus.views import pagination

from openstackclient_base.exceptions import HttpException

bp = environments.admin(blueprints.Blueprint('notifications', __name__))


class CreateNotification(wtf.Form):
    name = wtf.SelectField('Name', [wtf.Required()], choices=[])
    is_minimized = wtf.BooleanField('Is minimized')

    def __init__(self, *args, **kwargs):
        super(CreateNotification, self).__init__(*args, **kwargs)
        parameters = utils.notifications_api_call("/parameter")
        item_list = utils.notifications_api_call("/item")
        created_keys = set([par["key_"] for par in parameters])
        choices_dict = dict(((item["key_"], item["name"]) for item in item_list
                             if item["key_"] not in created_keys))
        self.name.choices = sorted(choices_dict.iteritems(),
                                   key=lambda i: i[1])
コード例 #4
0
ファイル: networks.py プロジェクト: altai/focus
# License along with this program. If not, see
# <http://www.gnu.org/licenses/>.

import flask
from flask import blueprints

from focus import clients

from focus.views import environments
from focus.views import forms
from focus.views import pagination

from openstackclient_base.exceptions import HttpException


bp = environments.admin(blueprints.Blueprint('networks', __name__))


@bp.route('')
def index():
    try:
        networks = clients.admin_clients().compute.networks.list()
    except HttpException as ex:
        networks = []
    tenants = clients.admin_clients().identity_admin.tenants.list()
    tenants = dict(((t.id, t.name) for t in tenants))
    p = pagination.Pagination(len(networks))
    offset = p.limit_offset()
    networks = [net._info for net in networks[offset[0]:offset[1]]]
    for net in networks:
        net["label"] = tenants.get(net["project_id"], net["label"])
コード例 #5
0
ファイル: notifications.py プロジェクト: altai/focus
import urllib

import flask
from flask import blueprints
from flaskext import wtf

from focus import utils

from focus.views import environments
from focus.views import forms
from focus.views import pagination

from openstackclient_base.exceptions import HttpException


bp = environments.admin(blueprints.Blueprint("notifications", __name__))


class CreateNotification(wtf.Form):
    name = wtf.SelectField("Name", [wtf.Required()], choices=[])
    is_minimized = wtf.BooleanField("Is minimized")

    def __init__(self, *args, **kwargs):
        super(CreateNotification, self).__init__(*args, **kwargs)
        parameters = utils.notifications_api_call("/parameter")
        item_list = utils.notifications_api_call("/item")
        created_keys = set([par["key_"] for par in parameters])
        choices_dict = dict(((item["key_"], item["name"]) for item in item_list if item["key_"] not in created_keys))
        self.name.choices = sorted(choices_dict.iteritems(), key=lambda i: i[1])

コード例 #6
0
ファイル: invitation_domains.py プロジェクト: altai/focus
# You should have received a copy of the GNU Lesser General Public
# License along with this program. If not, see
# <http://www.gnu.org/licenses/>.


import flask
from flask import blueprints
from flaskext import principal

from focus.models import orm
from focus.views import forms
from focus.views import environments
from focus.views import pagination


bp = environments.admin(blueprints.Blueprint('invitation_domains', __name__))


@bp.before_request
def prepare():
    principal.Permission(('role', 'admin')).test()
    flask.g.store = orm.get_store('INVITATIONS')


@bp.route('')
def index():
    total_count = flask.g.store.execute(
        'SELECT count(*) from email_masks').get_one()[0]
    p = pagination.Pagination(total_count)
    rows = flask.g.store.execute(
        'SELECT * from email_masks ORDER BY email_mask LIMIT ?, ?',
コード例 #7
0
ファイル: projects.py プロジェクト: altai/focus
"""
import flask
from flask import blueprints

from focus import clients
from focus import utils
from focus.models import orm
from focus.views import environments
from focus.views import forms
from focus.views import pagination


from openstackclient_base.exceptions import HttpException


bp = environments.admin(blueprints.Blueprint('projects', __name__))


@bp.route('')
def index():
    """List projects.

    List only enabled, sort by name.
    """

    tenants = utils.get_visible_tenants()
    ordered = sorted(tenants, key=lambda x: x.name)
    pagina = pagination.Pagination(ordered)
    delete_form = forms.DeleteForm()
    return {
        'objects': pagina.slice(ordered),
コード例 #8
0
ファイル: load_history.py プロジェクト: altai/focus
import contextlib
import datetime
import json
import re
import urllib
import urlparse

import flask

from flask import blueprints
from focus.models import orm
from focus.views import environments


bp = environments.admin(blueprints.Blueprint('load_history', __name__))


def baseurl():
    url = flask.current_app.config['ZABBIX_PROXY_BASEURL']
    if not url.endswith('/'):
        url += '/'
    return url


@bp.context_processor
def titles():
    return {
        'title': 'Load history',
        'subtitle': 'CPU/Load Avg./Mem/free space/io-wait history of every compute node'
        }
コード例 #9
0
ファイル: invitation_domains.py プロジェクト: altai/focus
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program. If not, see
# <http://www.gnu.org/licenses/>.

import flask
from flask import blueprints
from flaskext import principal

from focus.models import orm
from focus.views import forms
from focus.views import environments
from focus.views import pagination

bp = environments.admin(blueprints.Blueprint('invitation_domains', __name__))


@bp.before_request
def prepare():
    principal.Permission(('role', 'admin')).test()
    flask.g.store = orm.get_store('INVITATIONS')


@bp.route('')
def index():
    total_count = flask.g.store.execute(
        'SELECT count(*) from email_masks').get_one()[0]
    p = pagination.Pagination(total_count)
    rows = flask.g.store.execute(
        'SELECT * from email_masks ORDER BY email_mask LIMIT ?, ?',
コード例 #10
0
ファイル: users_management.py プロジェクト: altai/focus
Admins can list users, delete user, grant or revoke admin permissions.
TODO(apugachev) Look for a simpler way of deciding if user is admin.
TODO(apugachev) Add warnings for destroying operations.
TODO(apugachev) Add navigation inside this blueprint's pages.
"""
import flask
from flask import blueprints

from focus import clients
from focus import utils
from focus.views import environments
from focus.views import forms
from focus.views import pagination


bp = environments.admin(
    blueprints.Blueprint('global_user_management', __name__))


@bp.route('', methods=['GET'])
def index():
    """List users.

    TODO(apugachev): find way to count users without fetching all users.
    This would allow to use marker and limit to fetch one page only.
    """
    identity_admin = clients.admin_clients().identity_admin
    users = sorted(
        identity_admin.users.list(limit=1000000),
        key=lambda x: x.name)
    p = pagination.Pagination(users)
    data = p.slice(users)
コード例 #11
0
ファイル: users_management.py プロジェクト: altai/focus
Admins can list users, delete user, grant or revoke admin permissions.
TODO(apugachev) Look for a simpler way of deciding if user is admin.
TODO(apugachev) Add warnings for destroying operations.
TODO(apugachev) Add navigation inside this blueprint's pages.
"""
import flask
from flask import blueprints

from focus import clients
from focus import utils
from focus.views import environments
from focus.views import forms
from focus.views import pagination

bp = environments.admin(
    blueprints.Blueprint('global_user_management', __name__))


@bp.route('', methods=['GET'])
def index():
    """List users.

    TODO(apugachev): find way to count users without fetching all users.
    This would allow to use marker and limit to fetch one page only.
    """
    identity_admin = clients.admin_clients().identity_admin
    users = sorted(identity_admin.users.list(limit=1000000),
                   key=lambda x: x.name)
    p = pagination.Pagination(users)
    data = p.slice(users)
    potential_admins = set([
コード例 #12
0
ファイル: global_views.py プロジェクト: altai/focus
from flask import blueprints
from flaskext import mail
from flaskext import principal

from focus import clients
from focus import utils
from focus.models import row_mysql_queries
from focus.views import dataset
from focus.views import environments
from focus.views import exporter
from focus.views import forms
from focus.views import generic_billing
from focus.views import pagination


bp = environments.admin(blueprints.Blueprint('global_views', __name__))


@bp.before_request
def authorize():
    principal.Permission(('role', 'admin')).test()


@bp.route('configured_hostname/', methods=['GET', 'POST'])
def configured_hostname():
    '''
    Set hostname to use in all links set via email.
    '''
    form = forms.ConfigureHostnameForm()
    if form.validate_on_submit():
        # save
コード例 #13
0
ファイル: tariffs.py プロジェクト: altai/focus
"""List and update tariffs.

Restrict access of non-admin users.
"""
import sys

import flask
from flask import blueprints

from focus import clients
from focus.views import environments
from focus.views import forms
from focus.views import generic_billing


bp = environments.admin(blueprints.Blueprint('tariffs', __name__))


@bp.route('')
def index():
    """List tariffs"""
    tariffs = generic_billing.get_tariff_list()
    return {
        'tariffs': tariffs,
        'title': bp.name.replace('global_', '').replace('_', ' ').capitalize(),
        'subtitle': 'List of tariffs'
    }


@bp.route('<path:name>/', methods=['GET', 'POST'])
def edit(name):
コード例 #14
0
ファイル: images.py プロジェクト: altai/focus
        # NOTE(apugachev) for big this will fail to load and BrokenPipe
        # will be raised inside Flask
        return flask.jsonify({})

    @bp.route('progress/<uploaded_filename>/')
    def progress(uploaded_filename):
        r = flask.current_app.cache.get(uploaded_filename)
        return flask.jsonify(r or {})

    @bp.route('<image_id>/delete/', methods=['POST'])
    def delete(image_id):
        image = clients.admin_clients().glance.images.get(image_id)
        owner = getattr(image, 'owner')
        if owner == clients.get_systenant_id():
            principal.Permission(('role', 'admin')).test()
        else:
            principal.Permission(('role', 'member', owner)).test()
        form = forms.DeleteForm()
        if form.validate_on_submit():
            image.delete()
            flask.flash('Image successfully deleted', 'success')
        else:
            flask.flash('Invalid form', 'error')
        return flask.redirect(flask.url_for('.index'))

    return bp


ABP = environments.admin(get_bp('global_images'))
PBP = environments.project(get_bp('project_images'))
コード例 #15
0
ファイル: load_history.py プロジェクト: altai/focus
import contextlib
import datetime
import json
import re
import urllib
import urlparse

import flask

from flask import blueprints
from focus.models import orm
from focus.views import environments


bp = environments.admin(blueprints.Blueprint("load_history", __name__))


def baseurl():
    url = flask.current_app.config["ZABBIX_PROXY_BASEURL"]
    if not url.endswith("/"):
        url += "/"
    return url


@bp.context_processor
def titles():
    return {"title": "Load history", "subtitle": "CPU/Load Avg./Mem/free space/io-wait history of every compute node"}


COMPUTE_ON = 0