--- a +++ b/scripts/qiita-env @@ -0,0 +1,122 @@ +#!/usr/bin/env python + +# ----------------------------------------------------------------------------- +# Copyright (c) 2014--, The Qiita Development Team. +# +# Distributed under the terms of the BSD 3-clause License. +# +# The full license is in the file LICENSE, distributed with this software. +# ----------------------------------------------------------------------------- + +import click + +import qiita_db as qdb +from qiita_core.environment_manager import test as _test, TEST_RUNNERS +from qiita_core.configuration_manager import ConfigurationManager + +_CONFIG = ConfigurationManager() + + +@click.group() +def env(): + pass + + +@env.command() +@click.option('--load-ontologies/--no-load-ontologies', + default=True, help='If True, ontologies will be loaded. ' + 'Cannot be True if this is a test environment.') +@click.option('--download-reference/--no-download-reference', + default=False, help='If True, greengenes reference files will ' + 'be downloaded') +@click.option('--add-demo-user/--no-add-demo-user', + default=False, help='If True, then demo@microbio.me will be ' + 'added to the database with password ' + '"password"') +def make(load_ontologies, download_reference, add_demo_user): + """Creates the database specified in config""" + try: + qdb.environment_manager.make_environment( + load_ontologies, download_reference, add_demo_user) + except Exception as e: + if "Database qiita_test already present on the system." not in str(e): + # this will clean our environment so we can try again without + # having to have an other window open to remove the current + # environment. This is fine as we are actually creating a new + # environment. + qdb.environment_manager.drop_environment(False) + raise e + + +@env.command() +@click.option('--ask-for-confirmation/--no-ask-for-confirmation', + default=True, help='If True, will ask for confirmation before ' + 'dropping the production environment.') +def drop(ask_for_confirmation): + """Drops the database specified in config""" + try: + qdb.environment_manager.drop_environment(ask_for_confirmation) + except RuntimeError as e: + raise click.ClickException(str(e)) + + +@env.command() +def clean_test(): + """Cleans the test database environment. + + In case that the test database is dirty (i.e. the 'qiita' schema is + present), this cleans it up by dropping the 'qiita' schema and rebuilding + the test database. + """ + qdb.environment_manager.clean_test_environment() + + +@env.command() +def patch(): + """Patches the database schema based on the SETTINGS table + + Pulls the current patch from the settings table and applies all subsequent + patches found in the patches directory. + """ + qdb.environment_manager.patch() + + +@env.command() +@click.option('--runner', required=False, type=click.Choice(TEST_RUNNERS), + default='all', help='Test runner to use') +def test(runner): + """Test the environment + + Check to make sure that basic services are up and working. These include + connectivity to postgres, and redis. + + Tests are performed both on localhost and ipengines. + """ + _test(runner) + + +@env.command(name="create-portal") +@click.argument('portal', required=True, type=str) +@click.argument('description', required=True, type=str) +def add_portal(portal, description): + """Creates a new portal on the database""" + try: + qdb.portal.Portal.create(portal, description) + except qdb.exceptions.QiitaDBDuplicateError: + raise click.BadParameter("Portal name already exists!") + + +@env.command(name="remove-portal") +@click.argument('portal', required=True, type=str) +def rem_portal(portal): + """Removes a portal from the database""" + try: + qdb.portal.Portal.delete(portal) + except qdb.exceptions.QiitaDBError as e: + raise click.BadParameter(str(e)) + except qdb.exceptions.QiitaDBLookupError: + raise click.BadParameter("Portal name does not exist!") + + +if __name__ == '__main__': + env()