Adding Managers list

This commit is contained in:
Eibriel
2015-04-28 00:07:00 -03:00
parent fecaaa3f1d
commit cb47cfa1ce
6 changed files with 264 additions and 1 deletions
@@ -85,12 +85,14 @@ def list_integers_string(string_list):
from application.controllers.main import main
from application.controllers.jobs import jobs
from application.controllers.workers import workers
from application.controllers.managers import managers
from application.controllers.settings import settings
from application.controllers.projects import projects
from application.controllers.render import render
app.register_blueprint(main)
app.register_blueprint(jobs, url_prefix='/jobs')
app.register_blueprint(workers, url_prefix='/workers')
app.register_blueprint(managers, url_prefix='/managers')
app.register_blueprint(settings, url_prefix='/settings')
app.register_blueprint(projects, url_prefix='/projects')
app.register_blueprint(render, url_prefix='/render')
@@ -0,0 +1,62 @@
import json
from flask import (redirect,
render_template,
request,
url_for,
Blueprint)
from application import app
from application import http_server_request
BRENDER_SERVER = app.config['BRENDER_SERVER']
# Name of the Blueprint
managers = Blueprint('managers', __name__)
@managers.route('/')
def index():
managers = http_server_request('get', '/managers')
managers_list = []
for key in managers:
val = managers[key]
val['checkbox'] = '<input type="checkbox" value="' \
+ str(val['id']) + ';' + str(val['id']) + '"/>'
managers_list.append({
"DT_RowId": "manager_" + str(val['id']),
"0": val['checkbox'],
"1": key,
"2": val['uuid'],
"3": val['ip_address'],
"4": val['port'],
"5": val['connection'],
"6": val['id'],
})
entries = json.dumps(managers_list)
return render_template('managers/index.html',
entries=entries,
title='managers')
@managers.route('/edit', methods=['POST'])
def edit():
worker_ids = request.form['id']
worker_status = request.form['status'].lower()
#worker_config = {'system': 'linux',
# 'blender': 'local'}
params = dict(id=worker_ids, status=worker_status)
#'config': worker_config}
http_server_request('post', '/managers', params)
return redirect(url_for('managers.index'))
@managers.route('/view/<manager_id>')
def view(manager_id):
manager = http_server_request('get', '/managers/{0}'.format(manager_id))
return render_template('managers/view.html', manager=manager)
@@ -74,6 +74,9 @@
{% block nav %}
{% endblock %}
<ul class="nav navbar-nav navbar-right">
<li {% if title == 'managers': %} class="active"{% endif %}>
<a href="{{ url_for('managers.index') }}">Managers</a>
</li>
<li {% if title == 'workers': %} class="active"{% endif %}>
<a href="{{ url_for('workers.index') }}">Workers</a>
</li>
@@ -0,0 +1,134 @@
{% extends "layout.html" %}
{% block nav %}
<ul class="nav navbar-nav navbar-left">
<span class="navbar-brand">Managers</span>
<!--<li>
<div class="btn-group navbar-btn" role="group" aria-label="...">
<button type="button" class="btn btn-default" id="workers-disable" status="disabled">Disable</button>
<button type="button" class="btn btn-default" id="workers-enable" status="enabled">Enable</button>
</div>
<div class="btn-group navbar-btn" role="group" aria-label="...">
<button type="button" class="btn btn-default disabled">Restart</button>
<button type="button" class="btn btn-default disabled">Delete</button>
</div>
</li>-->
</ul>
{% endblock %}
{% block body %}
<div class="row">
<div class="col-md-12">
<table cellpadding="0" cellspacing="0" border="0" class="table table-striped table-condensed" id="workers">
<thead>
<tr>
<th width="5%"><input class="check-all" type="checkbox"></th>
<th width="20%">Hostname</th>
<th width="20%">UUID</th>
<th width="20%">IP Address</th>
<th width="20%">Port</th>
<th width="20%">Connection</th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<th></th>
<th>Hostname</th>
<th>UUID</th>
<th>IP Address</th>
<th>Port</th>
<th>Connection</th>
</tr>
</tfoot>
</table>
</div>
</div>
{% endblock %}
{% block footer_scripts %}
<script type="text/javascript">
$(document).ready(function() {
var data = {{ entries | safe }};
// TODO change to managers
var workersTable = $('#workers').dataTable({
"bProcessing": true,
"iDisplayLength": 25,
"aaData": data,
"aoColumns": [
{ "bSortable": false },
null,
null,
null,
null,
null
],
"fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
$('td:eq(1)', nRow).html('<a href="/managers/view/' + aData[2] + '"> ' + aData[1] + ' </a>');
if (aData[5] == "offline"){
$('td:eq(5)', nRow).html('<span class="label label-danger">offline</span>');
} else if (aData[5] == "online"){
$('td:eq(5)', nRow).html('<span class="label label-success">online</span>');
}
}
});
$("div.toolbar").html('Custom tool bar! Text/images etc.');
$(document).on("click", "#managers-enable, #managers-disable", function() {
var managers = new Array();
var checkbox_list = $( "tbody input:checked" );
for (var i = checkbox_list.length - 1; i >= 0; i--) {
var checkbox = checkbox_list[i];
managers.push($(checkbox).val());
};
if (managers.length == 0) {
$.growl("Please select one or more managers", {
type: "warning"
});
return false;
};
workers_ids = managers.join();
status = $(this).attr('status');
params = { 'id' : workers_ids, 'status' : status}
$.post("/managers/edit", params)
.done(function(data_fun) {
// console.log('Managers ' + workers_ids + ' updated : ' + status);
$.growl('Managers ' + workers_ids + ' ' + status);
// redrawing the table to display changes
var j = 0;
for (var i = 0; i < managers.length; i++) {
for (var j = 0; j < data.length; j++) {
id = data[j][6]+';'+data[j][8];
if (id == managers[i]) {
workersTable.fnUpdate(status, j, 5);
}
}
};
workersTable.fnDraw();
});
});
$(document).on("click", ".check-all", function(){
$("table input[type=checkbox]").attr('checked', $(this).is(':checked'));
});
});
</script>
{% endblock %}
@@ -0,0 +1,37 @@
{% extends "layout.html" %}
{% block footer_scripts %}
<script type="text/javascript">
$("#worker_refresh").click(function() {
console.log('Button Refresh worker');
location.reload();
});
</script>
{% endblock %}
{% block body %}
<div class="row">
<div class="span10">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
{{manager['id']}}
<a id="worker_refresh" href="#" class="glyphicon glyphicon-refresh pull-right"></a>
</h3>
</div>
<div class="panel-body">
<p>ip_address: {{ manager['ip_address'] | default('N/A')}}</p>
<p>port: {{ manager['port'] | default('N/A')}}</p>
<p>uuid: {{ manager['uuid'] | default('N/A')}}</p>
<p>settings: {{ manager['settings'] | default('N/A')}}</p>
</div>
<div class="panel-footer">
<p class="pull-right">
<span>load-average
</span>
</p>
<br class='clearfix'/>
</div>
</div>
</div>
</div>
{% endblock %}
@@ -1,5 +1,6 @@
import logging
import uuid
import requests
from flask import request
from flask import jsonify
from flask.ext.restful import Resource
@@ -14,6 +15,8 @@ from application.utils import list_integers_string
from application.modules.managers.model import Manager
from requests.exceptions import ConnectionError
parser = reqparse.RequestParser()
parser.add_argument('port', type=int)
parser.add_argument('name', type=str)
@@ -72,12 +75,34 @@ class ManagerListApi(Resource):
"name" : manager.name,
"ip_address" : manager.ip_address,
"port" : manager.port,
"connection" : 'online'
"connection" : 'online',
"uuid": manager.uuid
}
return jsonify(managers)
class ManagerApi(Resource):
def get(self, manager_uuid):
try:
manager = Manager.query.filter_by(uuid=manager_uuid).one()
except NoResultFound:
logging.warning("No manager found in Database")
return '', 404
manager_dict = {
'id': manager.id,
'ip_address': manager.ip_address,
'port': manager.port,
'uuid': manager.uuid,
}
url = 'http://' + manager.ip_address+':'+str(manager.port)+'/settings'
try:
r = requests.get(url)
manager_dict['settings'] = r.text
except ConnectionError:
logging.error(
'Can not connect with the Manager {0}'.format(manager.uuid))
return jsonify(manager_dict)
def patch(self, manager_uuid):
from application.modules.tasks import TaskApi