WIP: First API Call

This commit is contained in:
Jarret Raim 2013-02-19 06:19:27 -06:00
parent 4d8e0f32b7
commit e7dbb9b25e
4 changed files with 74 additions and 5 deletions

View File

@ -20,7 +20,7 @@ from flask.ext import login, wtf
from flask.ext.login import login_user from flask.ext.login import login_user
from barbican_api import api from barbican_api import api
from database import db_session, init_db from database import db_session, init_db
from models import User, Tenant, Key from models import User, Tenant, Key, Policy, Event
app = Flask(__name__) app = Flask(__name__)
@ -31,6 +31,8 @@ admin = Admin(app, name="Barbican Admin")
admin.add_view(ModelView(User, db_session)) admin.add_view(ModelView(User, db_session))
admin.add_view(ModelView(Tenant, db_session)) admin.add_view(ModelView(Tenant, db_session))
admin.add_view(ModelView(Key, db_session)) admin.add_view(ModelView(Key, db_session))
admin.add_view(ModelView(Policy, db_session))
admin.add_view(ModelView(Event, db_session))
login_manager = login.LoginManager() login_manager = login.LoginManager()
login_manager.init_app(app) login_manager.init_app(app)

View File

@ -12,11 +12,39 @@
:license: Apache 2.0, see LICENSE for details :license: Apache 2.0, see LICENSE for details
""" """
import json import json
from flask import Blueprint import uuid
from dateutil.parser import parse
from flask import Blueprint, request, jsonify
from models import Event
from database import db_session
api = Blueprint('api', __name__, url_prefix="/api") api = Blueprint('api', __name__, url_prefix="/api")
@api.route('/') @api.route('/')
def root(): def root():
return json.dumps({'hello': 'world'}) return jsonify(hello='World')
@api.route('/<int:tenant_id>/logs/', methods=['GET', 'POST'])
def log(tenant_id):
if request.method == 'POST':
agent_id = uuid.UUID(request.json['agent_id'])
received_on = parse(request.json['received_on'])
if request.json['severity'] in ['DEBUG', 'INFO', 'WARN', 'FATAL']:
severity = request.json['severity']
else:
severity = 'UNKNOWN'
ev = Event(tenant_id=tenant_id, agent_id=str(agent_id), received_on=received_on,
severity=severity, message=request.json['message'])
db_session.add(ev)
db_session.commit()
return jsonify(ev.as_dict())
else:
events = Event.query.filter_by(tenant_id=tenant_id).order_by(Event.received_on)
return jsonify(json_list=events.all())

View File

@ -9,7 +9,7 @@
:license: Apache 2.0, see LICENSE for details :license: Apache 2.0, see LICENSE for details
""" """
from uuid import uuid4 from uuid import uuid4
from sqlalchemy import Column, Integer, String, DateTime, Text from sqlalchemy import Column, Integer, String, DateTime, Text, Boolean
from sqlalchemy.orm import relationship, backref from sqlalchemy.orm import relationship, backref
from sqlalchemy.schema import ForeignKey from sqlalchemy.schema import ForeignKey
from database import Base from database import Base
@ -91,3 +91,28 @@ class Policy(Base):
def __repr__(self): def __repr__(self):
return '<Policy %s >' % self.uuid return '<Policy %s >' % self.uuid
class Event(Base):
__tablename__ = 'events'
id = Column(Integer, primary_key=True)
agent_id = Column(String(36))
received_on = Column(DateTime())
severity = Column(String(10))
message = Column(Text())
tenant_id = Column(Integer, ForeignKey('tenants.id'))
tenant = relationship("Tenant", backref=backref('events', order_by=id))
def __init__(self, tenant_id=None, agent_id=None, received_on=None, severity=None, message=None):
self.tenant_id = tenant_id
self.agent_id = agent_id
self.received_on = received_on
self.severity = severity
self.message = message
def __repr__(self):
return '<Event %s [%s] - %s >' % (self.received_on, self.severity, self.message[:25])
def as_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}

14
requirements.txt Normal file
View File

@ -0,0 +1,14 @@
Flask==0.9
Flask-Admin==1.0.4
Flask-Login==0.1.3
Flask-SQLAlchemy==0.16
Flask-WTF==0.8.2
Jinja2==2.6
SQLAlchemy==0.8.0b2
WTForms==1.0.3
Werkzeug==0.8.3
argparse==1.2.1
ipython==0.13.1
python-dateutil==2.1
six==1.2.0
wsgiref==0.1.2