added additional schema and migration

also moved the database into /tmp for now..
This commit is contained in:
David Lenwell 2013-10-04 01:24:29 -07:00
parent f90cac1452
commit 407c887244
6 changed files with 201 additions and 55 deletions

View File

@ -24,13 +24,13 @@ sys.path.append("./")
from alembic import context
from sqlalchemy import engine_from_config, pool
from logging.config import fileConfig
from refstack.web import app
from refstack import app
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
cur_db_uri = config.get_section_option('alembic', 'sqlalchemy.url')
my_db_uri = app.config.get('SQLALCHEMY_DATABASE_URI', cur_db_uri)
my_db_uri = 'sqlite:////tmp/refstack.db' # app.config.get('SQLALCHEMY_DATABASE_URI', cur_db_uri)
config.set_section_option('alembic', 'sqlalchemy.url', my_db_uri)
# Interpret the config file for Python logging.
@ -42,8 +42,8 @@ fileConfig(config.config_file_name)
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
# target_metadata = None
from refstack.models import db
target_metadata = db.metadata
from refstack.models import *
target_metadata = Base.metadata
def run_migrations_offline():

View File

@ -0,0 +1,22 @@
"""additions to schema
Revision ID: 501f41fac63a
Revises: 2bf99fa45ded
Create Date: 2013-09-20 10:18:32.223074
"""
# revision identifiers, used by Alembic.
revision = '501f41fac63a'
down_revision = '2bf99fa45ded'
from alembic import op
import sqlalchemy as sa
def upgrade():
pass
def downgrade():
pass

View File

@ -0,0 +1,56 @@
"""auto generating
Revision ID: 53fcc008b313
Revises: 501f41fac63a
Create Date: 2013-09-20 10:30:23.782772
"""
# revision identifiers, used by Alembic.
revision = '53fcc008b313'
down_revision = '501f41fac63a'
from alembic import op
import sqlalchemy as sa
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.create_table('test',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('cloud_id', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['cloud_id'], ['cloud.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_table('test_results',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('test_id', sa.Integer(), nullable=True),
sa.Column('timestamp', sa.DateTime(), nullable=True),
sa.Column('blob', sa.Binary(), nullable=True),
sa.ForeignKeyConstraint(['test_id'], ['test.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_table('test_status',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('test_id', sa.Integer(), nullable=True),
sa.Column('message', sa.String(length=1024), nullable=True),
sa.Column('finished', sa.Boolean(), nullable=True),
sa.Column('timestamp', sa.DateTime(), nullable=True),
sa.ForeignKeyConstraint(['test_id'], ['test.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.add_column(u'user', sa.Column('vendor_id', sa.Integer(), nullable=True))
op.add_column(u'user', sa.Column('authorized', sa.Boolean(), nullable=True))
### end Alembic commands ###
def downgrade():
### commands auto generated by Alembic - please adjust! ###
op.drop_column(u'user', 'authorized')
op.drop_column(u'user', 'vendor_id')
op.add_column(u'cloud', sa.Column(u'vendor_id', sa.INTEGER(), nullable=True))
op.drop_table('test_status')
op.drop_table('test_results')
op.drop_table('test')
### end Alembic commands ###

View File

@ -19,8 +19,10 @@ from flask import Flask, session
db_path = os.path.abspath(
os.path.join(os.path.basename(__file__), "../"))
#db_path = os.path.abspath(
# os.path.join(os.path.basename(__file__), "../"))
db_path = 'tmp'
app = Flask(__name__)

View File

@ -19,11 +19,11 @@
import argparse
from textwrap import dedent
from sqlalchemy.exc import IntegrityError
from refstack.localmodels import *
from refstack.models import *
def add(args):
"""add cloud
"""adds a cloud
refstack add --endpoint='http://127.0.0.1:5000/v3/' --test-user='demo'
--test-key='pass' --admin-endpoint='http://127.0.0.1:5000/v3/'
@ -50,7 +50,7 @@ def add(args):
def remove(args):
"""remove cloud
"""removes a cloud
refstack remove {cloud_id}
confirms that cloud-id 123 has been removed from the database as well as
@ -67,7 +67,7 @@ def remove(args):
def clouds(args):
"""returns either a list of cached tests"""
"""returns a list of your clouds"""
print 'Your clouds:\n'
print 'id | endpoint | test-user | admin-user '
print '---------------------------------------'
@ -79,7 +79,7 @@ def clouds(args):
def run(args):
"""run test command
refstack run --cloud_id {123} --sha {sha}
refstack run {cloud_id} --sha {sha}
triggers local run of tempest with specified cloud_id returns a
test_id so that the user can check status or cancel the test"""
@ -118,15 +118,6 @@ def tests(args):
print 'tests triggered'
def clouds(args):
"""returns either a list of cached tests"""
print 'Your clouds:\n'
print 'id | endpoint | test-user | admin-user '
print '---------------------------------------'
for row in db.query(Cloud).all():
print "%s | %s | %s | %s " % (row.id, row.endpoint, row.test_user, row.admin_user)
print ''
def subcommands(subparsers):
"""argparse subparsers with """
add_cloud_parser = subparsers.add_parser('add', help='Add a new Cloud')

View File

@ -13,49 +13,124 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy.exc import IntegrityError
from app import app
"""striaght up sqlalchemy declarative_base model structure.
db = SQLAlchemy(app)
*I created this because i was having a problem getting
the cli to use the models that were generated for the flask
webapp. The plan is to use this for both. But I have not
started my serious efforts on the web interface. dl 10.2013
*For now in dev I have this database in /tmp we can talk
about someplace else for it by default.
"""
from datetime import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker,relationship, backref
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Binary, Boolean
engine = create_engine('sqlite:////tmp/refstack.db', convert_unicode=True)
db = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
Base = declarative_base()
Base.query = db.query_property()
class Vendor(db.Model):
id = db.Column(db.Integer, primary_key=True)
vendor_name = db.Column(db.String(80), unique=True)
contact_email = db.Column(db.String(120), unique=True)
def __str__(self):
return self.vendor_name
class Cloud(db.Model):
id = db.Column(db.Integer, primary_key=True)
vendor_id = db.Column(db.Integer, db.ForeignKey('vendor.id'))
vendor = db.relationship('Vendor',
backref=db.backref('clouds',
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
vendor_id = Column(Integer, ForeignKey('vendor.id'))
vendor = relationship('Vendor',
backref=backref('clouds',
lazy='dynamic'))
endpoint = db.Column(db.String(120), unique=False)
test_user = db.Column(db.String(80), unique=False)
test_key = db.Column(db.String(80), unique=False)
admin_endpoint = db.Column(db.String(120), unique=False)
admin_user = db.Column(db.String(80), unique=False)
admin_key = db.Column(db.String(80), unique=False)
def __str__(self):
return self.endpoint
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(60))
email = db.Column(db.String(200), unique=True)
openid = db.Column(db.String(200), unique=True)
name = Column(String(60))
email = Column(String(200), unique=True)
openid = Column(String(200), unique=True)
authorized = Column(Boolean, default=False)
def __init__(self, name, email, openid):
self.name = name
self.email = email
self.openid = openid
def __str__(self):
return self.name
return self.name
class Vendor(Base):
__tablename__ = 'vendor'
id = Column(Integer, primary_key=True)
vendor_name = Column(String(80), unique=True)
contact_email = Column(String(120), unique=True)
def __str__(self):
return self.vendor_name
class Cloud(Base):
"""*need to take the time to descibe this stuff in detail.
"""
__tablename__ = 'cloud'
id = Column(Integer, primary_key=True)
endpoint = Column(String(120), unique=True)
test_user = Column(String(80), unique=False)
test_key = Column(String(80), unique=False)
admin_endpoint = Column(String(120), unique=False)
admin_user = Column(String(80), unique=False)
admin_key = Column(String(80), unique=False)
def __init__(self,
endpoint,
test_user,
test_key,
admin_endpoint,
admin_user,
admin_key):
"""init method to allow ordered input """
self.endpoint = endpoint
self.test_user = test_user
self.test_key = test_key
self.admin_endpoint = admin_endpoint
self.admin_user = admin_user
self.admin_key = admin_key
class Test(Base):
__tablename__ = 'test'
id = Column(Integer, primary_key=True)
cloud_id = Column(Integer, ForeignKey('cloud.id'))
cloud = relationship('Cloud',
backref=backref('tests',lazy='dynamic'))
status = relationship("TestStatus",
order_by="desc(test_status.timestamp)",
primaryjoin="TestStatus.test_id==Test.id")
class TestStatus(Base):
__tablename__ = 'test_status'
id = Column(Integer, primary_key=True)
test_id = Column(Integer, ForeignKey('test.id'))
message = Column(String(1024))
finished = Column(Boolean, default=False)
timestamp = Column(DateTime, default=datetime.now)
class TestResults(Base):
__tablename__ = 'test_results'
id = Column(Integer, primary_key=True)
test_id = Column(Integer, ForeignKey('test.id'))
test = relationship('Test',
backref=backref('results',lazy='dynamic'))
timestamp = Column(DateTime, default=datetime.now)
blob = Column(Binary)