Merge "Create spec for optional subunit data import"
This commit is contained in:
commit
fe2eca2ea6
315
specs/pike/approved/upload-subunit-tests.rst
Normal file
315
specs/pike/approved/upload-subunit-tests.rst
Normal file
@ -0,0 +1,315 @@
|
||||
=============================================
|
||||
Upload Subunit Data From Test Results
|
||||
=============================================
|
||||
|
||||
Launchpad blueprint:
|
||||
|
||||
* https://blueprints.launchpad.net/refstack/+spec/subunit-data-upload
|
||||
|
||||
This specification describes an expansion of the RefStack API's
|
||||
functionality to allow for upload of the subunit data which corresponds
|
||||
to a given set of test results.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Currently, all test results uploaded to the RefStack website consists
|
||||
of a json file containing only the portion of the RefStack run pertaining
|
||||
to the passed tests. This limitation dates back to the the start of the
|
||||
RefStack project. At that time, Defcore (which is now known as interop-WG)
|
||||
was very concerned about the possibility that private data may be included
|
||||
in the subunit upload file. Defcore was concerned that vendors might, for
|
||||
that reason, be hesistant to upload data into RefStack for fear of
|
||||
unintentionally revealing vendor-specific data such as reasons for test
|
||||
failures. For this reason, Defcore agreed unanimously that RefStack should
|
||||
care only about passing tests, and not failed or skipped ones.
|
||||
|
||||
The risk, with this resolution, however, is that not including a full set of
|
||||
results means that it would be fairly simple to falsify those results in
|
||||
order to make an OpenStack instance appear to be more interoperable than
|
||||
it actually is. This too, was discussed at the time, and Defcore eventually
|
||||
arrived at the conclusion that, in the end, it would be better to accept
|
||||
vendor results in good faith, but to always leave the door open for users
|
||||
and Foundation staff to verify those results independently. This decision
|
||||
did not, however, account for the possibility that vendors seeking support
|
||||
during the process of verifying the interoperability of their product may
|
||||
need a way to securely share subunit data for review by Foundation staff.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
In order to move towards having a more reliable and verifiable collection
|
||||
of RefStack results, we intend to add functionality to the RefStack
|
||||
toolkit that will allow for the upload of the subunit data related to a given
|
||||
set of test results. This data would be private, only accessible to the party
|
||||
uploading it, and to foundation staff, to be used for result integrity
|
||||
verification as well as debugging assistance. Upload of subunit data will not,
|
||||
for the time being, be required.
|
||||
|
||||
After discussing a number of data storage methods at the 7/18/17 RefStack
|
||||
meeting[3], we settled upon saving the newly usable subunit data in the
|
||||
current database. With a small adjustment to our alembic settings (which
|
||||
will keep the version tables from colliding), this could be done using the
|
||||
existing subunit2sql toolkit[4]. In order to apply the table name change,
|
||||
we will build in a series of functions that check refstack.conf and rename
|
||||
the existing alembic version table if needed. This added functionality,
|
||||
when merged and functional, will make RefStack one of only two OpenStack
|
||||
projects (according to oslo.conf docs[7])that is currently capable of
|
||||
modifying configuration at runtime without a service restart. The usage of
|
||||
subunit2sql will do a lot of the heavy lifting for us, as far as data import
|
||||
goes, as well as keeping the storage method of test data consistent across
|
||||
the board.
|
||||
|
||||
For the time being, we plan to link the subunit data will be linked to the
|
||||
corresponding test results via a key value pair in the metadata table that
|
||||
is an existing part of the RefStack database.
|
||||
|
||||
Toolset to use:
|
||||
|
||||
subunit2sql
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
Though we did eventually decide upon storing the new data in a new, separate
|
||||
database, a few alternate options were discussed during the 7/18/17 RefStack
|
||||
meeting[3]. The alternate options discussed were:
|
||||
* Save subunit files as-is in a file system. This has the benefit of being the
|
||||
least processing-intensive option for saving the data, as it would literally
|
||||
just save the output into a file. It may, however, make subunit data upload
|
||||
a bit less elegant, as well as being a deviation from the way test run data
|
||||
is managed throughout the rest of RefStack.
|
||||
* Save subunit data in the RefStack database and tables by building in the
|
||||
functionality required to save and manage it. Like the option listed above,
|
||||
this option keeps test run data stored consistently across refstack, which
|
||||
would make the changes to the API more consistent as well. It would also
|
||||
avoid the overhead that would result from using a separate database, as well
|
||||
as any redundancies that resulted from using a second, separate database.
|
||||
However, any redundancy would be fairly minor due to the extremely limited
|
||||
scope of the data we are currently storing from each test run, and this would
|
||||
leave more of the implementation up to us, which, because of how well
|
||||
subunit2sql's schema fulfills the needs of this change, may be wholly
|
||||
unnecessary.
|
||||
* Save subunit data in a separate database created by subunit2sql. This has the
|
||||
benefit of having all of the functionality we need without forcing us to
|
||||
reinvent the wheel, but it also carries with it the overhead of having to use
|
||||
a second database. This option doesn't make much sense, however, given that
|
||||
we can actually use subunit2sql's toolkit in the current refstack database,
|
||||
as long as we can configure the database to use an extra (differently named)
|
||||
alembic version table for refstack's core db.
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
We may be able to use the tables created by subunit2sql within the RefStack
|
||||
database. These tables (for reference) are mapped out below:
|
||||
|
||||
--------------------------------------
|
||||
| tests |
|
||||
--------------------------------------
|
||||
| id | String(256) |
|
||||
| test_id | String(256) |
|
||||
| run_count | Integer |
|
||||
| failure | Integer |
|
||||
| run_time | Float |
|
||||
--------------------------------------
|
||||
|
||||
----------------------------------------
|
||||
| runs |
|
||||
----------------------------------------
|
||||
| id | BigInteger |
|
||||
| skips | Integer |
|
||||
| fails | Integer |
|
||||
| passes | Integer |
|
||||
| run_time | Float |
|
||||
| artifacts | Text |
|
||||
| run_at | DateTime |
|
||||
----------------------------------------
|
||||
|
||||
---------------------------------------------------
|
||||
| test_runs |
|
||||
---------------------------------------------------
|
||||
| id | BigInteger |
|
||||
| test_id | BigInteger |
|
||||
| run_id | BigInteger |
|
||||
| status | String(256) |
|
||||
| start_time | DateTime |
|
||||
| start_time_microseconds | Integer |
|
||||
| stop_time | DateTime |
|
||||
| stop_time_microseconds | Integer |
|
||||
| test | Test |
|
||||
| run | Run |
|
||||
---------------------------------------------------
|
||||
|
||||
-------------------------------------------
|
||||
| run_metadata |
|
||||
-------------------------------------------
|
||||
| id | BigInteger |
|
||||
| key | String(255) |
|
||||
| value | String(255) |
|
||||
| run_id | BigInteger |
|
||||
| run | Run |
|
||||
-------------------------------------------
|
||||
|
||||
-------------------------------------------
|
||||
| test_run_metadata |
|
||||
-------------------------------------------
|
||||
| id | BigInteger |
|
||||
| key | String(255) |
|
||||
| value | String(255) |
|
||||
| test_run_id | BigInteger |
|
||||
| test_run | TestRun |
|
||||
-------------------------------------------
|
||||
|
||||
-------------------------------------------
|
||||
| test_metadata |
|
||||
-------------------------------------------
|
||||
| id | BigInteger |
|
||||
| key | String(255) |
|
||||
| value | String(255) |
|
||||
| test_id | BigInteger |
|
||||
| test | Test |
|
||||
-------------------------------------------
|
||||
|
||||
-------------------------------------------
|
||||
| attachments |
|
||||
-------------------------------------------
|
||||
| id | BigInteger |
|
||||
| test_run_id | BigInteger |
|
||||
| label | String(255) |
|
||||
| attachment | LargeBinary |
|
||||
| test_run | TestRun |
|
||||
-------------------------------------------
|
||||
|
||||
more details about this data model can be found in the source docs for
|
||||
subunit2sql[5]
|
||||
|
||||
If we end up being unable to integrate the two databases into one at this time,
|
||||
we plan to use the metadata table which already exists in the RefStack internal
|
||||
db to store a key pair that links the existing test data to the newly added
|
||||
subunit data.
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
We will need to implement a new REST API for the upload of subunit data
|
||||
from the client, and then use subunit2sql to process and save the data
|
||||
into the database.
|
||||
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
It has been suggested that uploading the subunit data for tests may expose
|
||||
private data. However, it was determined in the 6/27/2017 RefStack meeting[1]
|
||||
that if any such data is revealed through this upload, it would be due to a
|
||||
leak in tempest's logging procedures, not the upload of this new type of data.
|
||||
|
||||
This was also discussed at the 6/28/17 Interop-wg meeting[2]. It was at this
|
||||
meeting that was confirmed that we would implement this change using an
|
||||
opt-in flag, so that those who are still concerned about the security of
|
||||
uploading the results do not, by default, have to upload their data. It was
|
||||
also determined that, due to the fact that this design reflects a fairly
|
||||
significant reversal in a past decision, that the community should be
|
||||
properly notified. This decision also resulted in the following action plan:
|
||||
1. write an email to distribute to the mailing list
|
||||
2. send out the official decision after the email is distributed
|
||||
3. change the offical interop docs to reflect this change
|
||||
|
||||
Another concern was that a database injection attack may be possible, if an
|
||||
attacker were to use maliciously crafted subunit data. This threat, also,
|
||||
does not appear to be much of a danger, as the mass majority of the data
|
||||
written to the database is done after the subunit data is processed, meaning
|
||||
that there are very few places in which raw strings are written into the db.
|
||||
We need to look a little more into whether sql does enough input sanitization
|
||||
for our needs.
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
None
|
||||
|
||||
Performance impact
|
||||
-------------------
|
||||
|
||||
None
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
We will also need to adjust refstack-client to be able to consume the new API
|
||||
feature while uploading subunit data.
|
||||
|
||||
One of the most user-visible part of this change would be the creation of a
|
||||
flag option which enables the upload of the subunit data to the refstack site,
|
||||
which would modify the existing procedure in that we would need to build in
|
||||
functionality that would allow for the additional data upload.
|
||||
|
||||
We would also need to add a second flag to the database sync functionality in
|
||||
order to allow for the alternate naming of the alembic version table, which
|
||||
enables us to use both subunit2sql and refstack tables and functionality
|
||||
within the same database.
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
None
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignees(s)
|
||||
------------
|
||||
|
||||
Primary assignee:
|
||||
Megan Guiney
|
||||
|
||||
Other contributors:
|
||||
Paul Van Eck (subunit data upload ui in refstack-client)
|
||||
|
||||
Work Items
|
||||
----------
|
||||
* Add a CONF option to allow for the usage of nonstandard alembic
|
||||
version table names.
|
||||
* Add a utility that allows for the runtime checking and alteration
|
||||
of alembic version table names.
|
||||
* Create an API at the server side to accept the subunit data
|
||||
* At the server side, use subunit2sql to process the subunit data
|
||||
* Link subunit data to existing set of refstack results.
|
||||
* Create UI to upload subunit data (completed, as of 1/20/2016[6],
|
||||
though may require update)
|
||||
* Create a UI to display subunit data. There may already be one, but
|
||||
we need to make sure such a utility exists. We also need to decide
|
||||
whether the results should be viewable via the refstack website.
|
||||
|
||||
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
We will need to update the docs to reflect the additions to the API, the
|
||||
database, and to refstack-client as well.
|
||||
|
||||
References
|
||||
==========
|
||||
[1] http://eavesdrop.openstack.org/meetings/refstack/2017/refstack.
|
||||
2017-06-27-19.00.log.html
|
||||
[2] http://eavesdrop.openstack.org/meetings/interopwg/2017/interopwg.
|
||||
2017-06-28-16.00.log.html
|
||||
[3] http://eavesdrop.openstack.org/meetings/refstack/2017/refstack.
|
||||
2017-07-18-19.00.log.html
|
||||
[4] https://git.openstack.org/cgit/openstack-infra/subunit2sql
|
||||
[5] https://docs.openstack.org/subunit2sql/latest/data_model.html
|
||||
[6] https://review.openstack.org/#/c/265394/
|
||||
[7] https://docs.openstack.org/oslo.config/latest/configuration/
|
||||
mutable.html
|
Loading…
Reference in New Issue
Block a user