Skip to content

Commit 60129c2

Browse files
georges-armGerrit Code Review
authored andcommitted
Merge "Allow submitting associated test parameters alongside results" into dps-lnt-dev-aws
2 parents 872e1c9 + 9a22959 commit 60129c2

File tree

3 files changed

+94
-3
lines changed

3 files changed

+94
-3
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Add new TestParam table per db
2+
from sqlalchemy.ext.declarative import declarative_base
3+
from sqlalchemy import Column, Integer, String, Table, ForeignKey, LargeBinary, Index, select, MetaData
4+
from lnt.server.db.migrations.util import introspect_table, rename_table
5+
from sqlalchemy.orm import relation, mapper, Session
6+
7+
8+
Base = declarative_base()
9+
10+
11+
def update_testsuite(session, meta, db_key_name):
12+
class Test(object):
13+
pass
14+
15+
test_table = Table('%s_Test' % db_key_name, meta, autoload=True)
16+
mapper(Test, test_table)
17+
18+
class TestParam(Base):
19+
__tablename__ = db_key_name + '_TestParam'
20+
id = Column("ID", Integer, primary_key=True)
21+
name = Column("Name", String(128), index=True)
22+
value = Column("Value", String(128))
23+
test_id = Column("TestID", Integer, ForeignKey(Test.id), index=True)
24+
test = relation(Test)
25+
26+
test_table.params = relation(TestParam, back_populates='test',
27+
cascade="all, delete-orphan")
28+
29+
Base.metadata.create_all(session)
30+
31+
32+
def upgrade(engine):
33+
test_suite = introspect_table(engine, 'TestSuite')
34+
meta = MetaData(bind=engine)
35+
36+
with Session(engine) as session, session.begin():
37+
db_keys = list(session.execute(select([test_suite])))
38+
39+
for suite in db_keys:
40+
update_testsuite(session, meta, suite[2])

lnt/server/db/testsuitedb.py

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -438,14 +438,48 @@ def __init__(self, name):
438438

439439
def __repr__(self):
440440
return '%s_%s%r' % (db_key_name, self.__class__.__name__,
441-
(self.id, self.name))
441+
(self.id, self.name, self.params))
442442

443-
def __json__(self, include_id=True):
443+
def __json__(self, include_id=True, include_params=True):
444444
result = {'name': self.name}
445445
if include_id:
446446
result['id'] = self.id
447+
if include_params:
448+
result["params"] = {p.name: p.value for p in self.params}
447449
return result
448450

451+
class TestParam(self.base, ParameterizedMixin):
452+
__tablename__ = db_key_name + '_TestParam'
453+
# utf8_bin for case sensitive compare
454+
__table_args__ = {'mysql_collate': 'utf8_bin'}
455+
id = Column("ID", Integer, primary_key=True)
456+
name = Column("Name", String(128), index=True)
457+
value = Column("Value", String(128))
458+
459+
test_id = Column("TestID", Integer, ForeignKey(Test.id), index=True)
460+
test = relation(Test)
461+
462+
def __init__(self, test, name, value):
463+
self.id = None
464+
self.test = test
465+
self.name = name
466+
self.value = value
467+
468+
def __repr__(self):
469+
return '%s_%s%r' % (db_key_name, self.__class__.__name__,
470+
(self.id, self.test, self.name, self.value))
471+
472+
def __json__(self):
473+
return {
474+
"id": self.id,
475+
"test": self.test.__json__(include_params=False),
476+
"name": self.name,
477+
"value": self.value,
478+
}
479+
480+
Test.params = relation(TestParam, back_populates='test',
481+
cascade="all, delete-orphan")
482+
449483
class Profile(self.base):
450484
__tablename__ = db_key_name + '_Profile'
451485

@@ -775,6 +809,7 @@ def __json__(self):
775809
self.Machine = Machine
776810
self.Run = Run
777811
self.Test = Test
812+
self.TestParam = TestParam
778813
self.Profile = Profile
779814
self.Sample = Sample
780815
self.Order = Order
@@ -1067,9 +1102,24 @@ def is_profile_only(td):
10671102
test_cache[name] = test
10681103
session.add(test)
10691104

1105+
if "params" in test_data:
1106+
for param_name, param_value in test_data["params"].items():
1107+
matching_params = [p for p in test.params if p.name == param_name]
1108+
assert len(matching_params) <= 1
1109+
if len(matching_params) == 0:
1110+
# Add new parameter definition.
1111+
param = self.TestParam(test, param_name, param_value)
1112+
session.add(param)
1113+
elif param_value is not None:
1114+
# Update existing parameter definition.
1115+
matching_params[0].value = param_value
1116+
else:
1117+
# Erase previously existing parameter definition.
1118+
session.delete(matching_params[0])
1119+
10701120
samples = []
10711121
for key, values in test_data.items():
1072-
if key == 'name' or key == "id" or key.endswith("_id"):
1122+
if key in ("name", "id", "params") or key.endswith("_id"):
10731123
continue
10741124
field = field_dict.get(key)
10751125
if field is None and key != 'profile':

lnt/server/ui/views.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ def index():
121121
###
122122
# Database Actions
123123
def _do_submit():
124+
print("hi!")
124125
assert request.method == 'POST'
125126
input_file = request.files.get('file')
126127
input_data = request.form.get('input_data')

0 commit comments

Comments
 (0)