added additional schema and migration
also moved the database into /tmp for now..
This commit is contained in:
parent
f90cac1452
commit
407c887244
@ -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():
|
||||
|
22
alembic/versions/501f41fac63a_additions_to_schema.py
Normal file
22
alembic/versions/501f41fac63a_additions_to_schema.py
Normal 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
|
56
alembic/versions/53fcc008b313_auto_generating.py
Executable file
56
alembic/versions/53fcc008b313_auto_generating.py
Executable 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 ###
|
@ -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__)
|
||||
|
||||
|
@ -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')
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user