-
Notifications
You must be signed in to change notification settings - Fork 20
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* feat(dos): dos get endpoint * feat(prefix): prepend prefix option
- Loading branch information
Showing
15 changed files
with
572 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
# A dockerfile based on our .travis.yml | ||
# Useful for running the tests locally | ||
# in a self contained environment | ||
FROM python:2-slim | ||
|
||
RUN echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee /etc/apt/sources.list.d/webupd8team-java.list \ | ||
&& echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list \ | ||
&& apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886 \ | ||
&& apt-get update && \ | ||
mkdir -p /usr/share/man/man1/ \ | ||
&& apt-get install -y software-properties-common && \ | ||
(echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections) && \ | ||
apt-get install -y oracle-java8-set-default && \ | ||
apt-get clean && \ | ||
rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/* | ||
|
||
# Install Deps | ||
RUN dpkg --add-architecture i386 && apt-get update && apt-get install -y --force-yes expect git wget libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1 python curl libqt5widgets5 | ||
|
||
# update some packages | ||
RUN apt-get install -y ca-certificates && update-ca-certificates | ||
|
||
RUN apt-get install -y --no-install-recommends build-essential python-dev libpq-dev libevent-dev libmagic-dev zip unzip \ | ||
&& apt-get clean && rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/* | ||
|
||
RUN wget https://oss.sonatype.org/content/repositories/releases/io/swagger/swagger-codegen-cli/2.3.1/swagger-codegen-cli-2.3.1.jar | ||
|
||
COPY test-requirements.txt /indexd/test-requirements.txt | ||
COPY requirements.txt /indexd/requirements.txt | ||
WORKDIR /indexd | ||
RUN pip install -r test-requirements.txt && pip install -r requirements.txt | ||
|
||
COPY . /indexd | ||
|
||
RUN java -jar /swagger-codegen-cli-2.3.1.jar generate -i openapis/swagger.yaml -l python -o swagger_client \ | ||
&& cd swagger_client; python setup.py install; cd .. \ | ||
&& python setup.py install --force \ | ||
&& pwd && py.test -vv tests |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
import flask | ||
|
||
from indexd.blueprint import dist_get_record | ||
|
||
from indexd.errors import AuthError | ||
from indexd.errors import UserError | ||
from indexd.alias.errors import NoRecordFound as AliasNoRecordFound | ||
from indexd.index.errors import NoRecordFound as IndexNoRecordFound | ||
|
||
blueprint = flask.Blueprint('dos', __name__) | ||
|
||
blueprint.config = dict() | ||
blueprint.index_driver = None | ||
blueprint.alias_driver = None | ||
blueprint.dist = [] | ||
|
||
@blueprint.route('/ga4gh/dos/v1/dataobjects/<path:record>', methods=['GET']) | ||
def get_dos_record(record): | ||
''' | ||
Returns a record from the local ids, alias, or global resolvers. | ||
Returns DOS Schema | ||
''' | ||
|
||
try: | ||
ret = blueprint.index_driver.get(record) | ||
ret['alias'] = blueprint.index_driver.get_aliases_for_did(record) | ||
except IndexNoRecordFound: | ||
try: | ||
ret = blueprint.index_driver.get_by_alias(record) | ||
ret['alias'] = blueprint.index_driver.get_aliases_for_did(ret['did']) | ||
except IndexNoRecordFound: | ||
try: | ||
ret = blueprint.alias_driver.get(record) | ||
except AliasNoRecordFound: | ||
if not blueprint.dist: | ||
raise | ||
ret = dist_get_record(record) | ||
|
||
return flask.jsonify(indexd_to_dos(ret)), 200 | ||
|
||
@blueprint.route('/ga4gh/dos/v1/dataobjects/list', methods=['POST']) | ||
def list_dos_records(): | ||
''' | ||
Returns a record from the local ids, alias, or global resolvers. | ||
Returns DOS Schema | ||
''' | ||
start = flask.request.json.get('page_token') | ||
limit = flask.request.json.get('page_size') | ||
|
||
try: | ||
limit = 100 if limit is None else int(limit) | ||
except ValueError: | ||
raise UserError('limit must be an integer') | ||
|
||
if limit <= 0 or limit > 1024: | ||
raise UserError('limit must be between 1 and 1024') | ||
|
||
url = flask.request.json.get('url') | ||
|
||
# Support this in the future when we have | ||
# more fully featured aliases? | ||
#alias = flask.request.json.get('alias') | ||
|
||
checksum = flask.request.json.get('checksum') | ||
if checksum: | ||
hashes = {checksum['type']: checksum['checksum']} | ||
else: | ||
hashes = None | ||
|
||
records = blueprint.index_driver.ids( | ||
start=start, | ||
limit=limit, | ||
urls=url, | ||
hashes=hashes | ||
) | ||
|
||
for record in records: | ||
record['alias'] = blueprint.index_driver.get_aliases_for_did(record['did']) | ||
|
||
ret = {"data_objects": [indexd_to_dos(record)['data_object'] for record in records]} | ||
|
||
return flask.jsonify(ret), 200 | ||
|
||
def indexd_to_dos(record): | ||
data_object = { | ||
"id": record['did'], | ||
"name": record['file_name'], | ||
'created': record['created_date'], | ||
'updated': record['updated_date'], | ||
"size": record['size'], | ||
"version": record['rev'], | ||
"description": "", | ||
"mime_type": "" | ||
} | ||
|
||
data_object['aliases'] = record['alias'] | ||
|
||
# parse out checksums | ||
data_object['checksums'] = [] | ||
for k in record['hashes']: | ||
data_object['checksums'].append( | ||
{'checksum': record['hashes'][k], 'type': k}) | ||
|
||
# parse out the urls | ||
data_object['urls'] = [] | ||
for url in record['urls']: | ||
url_object = { | ||
'url': url } | ||
if 'metadata' in record and record['metadata']: | ||
url_object['system_metadata'] = record['metadata'] | ||
if 'urls_metadata' in record and url in record['urls_metadata'] and record['urls_metadata'][url]: | ||
url_object['user_metadata'] = record['urls_metadata'][url] | ||
data_object['urls'].append(url_object) | ||
|
||
result = { "data_object": data_object } | ||
return result | ||
|
||
|
||
@blueprint.errorhandler(UserError) | ||
def handle_user_error(err): | ||
ret = { msg: str(err), status_code: 0 } | ||
return flask.jsonify(ret), 400 | ||
|
||
@blueprint.errorhandler(AuthError) | ||
def handle_auth_error(err): | ||
ret = { msg: str(err), status_code: 0 } | ||
return flask.jsonify(ret), 403 | ||
|
||
@blueprint.errorhandler(AliasNoRecordFound) | ||
def handle_no_alias_record_error(err): | ||
ret = { msg: str(err), status_code: 0 } | ||
return flask.jsonify(ret), 404 | ||
|
||
@blueprint.errorhandler(IndexNoRecordFound) | ||
def handle_no_index_record_error(err): | ||
ret = { msg: str(err), status_code: 0 } | ||
return flask.jsonify(ret), 404 | ||
|
||
@blueprint.record | ||
def get_config(setup_state): | ||
index_config = setup_state.app.config['INDEX'] | ||
alias_config = setup_state.app.config['ALIAS'] | ||
blueprint.index_driver = index_config['driver'] | ||
blueprint.alias_driver = alias_config['driver'] | ||
if 'DIST' in setup_state.app.config: | ||
blueprint.dist = setup_state.app.config['DIST'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.