Esempio n. 1
0
def collect_queries(query_name=None):
    """
    Consults the app-interface and constructs the list of queries
    to be executed.

    :param query_name: (optional) query to look for

    :return: List of queries dictionaries
    """
    queries_list = []

    # Items to be either overridden ot taken from the k8s secret
    db_conn_items = {
        'db.host': None,
        'db.name': None,
        'db.password': None,
        'db.port': None,
        'db.user': None
    }

    sql_queries = queries.get_app_interface_sql_queries()

    for sql_query in sql_queries:
        name = sql_query['name']

        # Looking for a specific query
        if query_name is not None:
            if name != query_name:
                continue

        namespace = sql_query['namespace']
        identifier = sql_query['identifier']

        # Due to an API limitation, the keys are coming with underscore
        # instead of period, so we are using this unpacking routine
        # to also replace "_" by "." in the keys
        if sql_query['overrides'] is not None:
            overrides = {
                key.replace('_', '.'): value
                for key, value in sql_query['overrides'].items()
                if value is not None
            }
        else:
            overrides = {}

        # Merging the overrides. Values that are still None after this
        # will be taken from the k8s secret on template rendering
        db_conn = {**db_conn_items, **overrides}

        # Output can be:
        # - stdout
        # - filesystem
        output = sql_query['output']
        if output is None:
            output = 'stdout'

        # Extracting the terraformResources information from the namespace
        # fo the given identifier
        tf_resource_info = get_tf_resource_info(namespace, identifier)

        queries_list.append(
            # building up the final query dictionary
            {
                'name': name,
                'namespace': namespace,
                'identifier': sql_query['identifier'],
                'db_conn': db_conn,
                'output': output,
                'query': sql_query['query'].replace("'", "''"),
                **tf_resource_info,
            })

    return queries_list
def collect_queries(query_name=None, settings=None):
    """
    Consults the app-interface and constructs the list of queries
    to be executed.

    :param query_name: (optional) query to look for
    :param settings: App Interface settings

    :return: List of queries dictionaries
    """
    queries_list = []

    # Items to be either overridden ot taken from the k8s secret
    db_conn_items = {
        "db.host": None,
        "db.name": None,
        "db.password": None,
        "db.port": None,
        "db.user": None,
    }

    sql_queries = queries.get_app_interface_sql_queries()

    for sql_query in sql_queries:
        name = sql_query["name"]

        for existing in queries_list:
            if existing["name"] == name:
                logging.error(["SQL-Query %s defined more than once"], name)
                sys.exit(ExitCodes.ERROR)

        # Looking for a specific query
        if query_name is not None:
            if name != query_name:
                continue

        namespace = sql_query["namespace"]
        identifier = sql_query["identifier"]

        # Due to an API limitation, the keys are coming with underscore
        # instead of period, so we are using this unpacking routine
        # to also replace "_" by "." in the keys
        if sql_query["overrides"] is not None:
            overrides = {
                key.replace("_", "."): value
                for key, value in sql_query["overrides"].items()
                if value is not None
            }
        else:
            overrides = {}

        # Merging the overrides. Values that are still None after this
        # will be taken from the k8s secret on template rendering
        db_conn = {**db_conn_items, **overrides}

        # Output can be:
        # - stdout
        # - filesystem
        # - encrypted
        output = sql_query["output"]
        if output is None:
            output = "stdout"
        elif output == "encrypted":
            requestor = sql_query.get("requestor")
            if requestor is None:
                logging.error(
                    "a requestor is required to get encrypted output")
                sys.exit(ExitCodes.ERROR)
            public_gpg_key = requestor.get("public_gpg_key")
            user_name = requestor.get("org_username")
            if public_gpg_key is None:
                logging.error(["user %s does not have a public gpg key"],
                              user_name)
                sys.exit(ExitCodes.ERROR)

        # Extracting the terraformResources information from the namespace
        # fo the given identifier
        tf_resource_info = get_tf_resource_info(namespace, identifier)
        if tf_resource_info is None:
            logging.error(
                ["Could not find rds identifier %s in namespace %s"],
                identifier,
                namespace["name"],
            )
            sys.exit(ExitCodes.ERROR)

        sql_queries = []
        if sql_query["query"] is not None:
            sql_queries.append(sql_query["query"])

        if sql_query["queries"] is not None:
            sql_queries.extend(sql_query["queries"])

        sql_queries = [item.replace("'", "''") for item in sql_queries]

        # building up the final query dictionary
        item = {
            "name": name,
            "namespace": namespace,
            "identifier": sql_query["identifier"],
            "db_conn": db_conn,
            "output": output,
            "queries": sql_queries,
            **tf_resource_info,
        }

        if output == "encrypted":
            smtp_client = SmtpClient(settings=settings)
            item["recipient"] = smtp_client.get_recipient(
                sql_query["requestor"]["org_username"])
            item["public_gpg_key"] = sql_query["requestor"][
                "public_gpg_key"].replace("\n", "")

        # If schedule is defined
        # this should be a CronJob
        schedule = sql_query.get("schedule")
        if schedule:
            item["schedule"] = schedule

        queries_list.append(item)

    return queries_list
Esempio n. 3
0
def collect_queries(query_name=None):
    """
    Consults the app-interface and constructs the list of queries
    to be executed.

    :param query_name: (optional) query to look for

    :return: List of queries dictionaries
    """
    queries_list = []

    # Items to be either overridden ot taken from the k8s secret
    db_conn_items = {
        'db.host': None,
        'db.name': None,
        'db.password': None,
        'db.port': None,
        'db.user': None
    }

    sql_queries = queries.get_app_interface_sql_queries()

    for sql_query in sql_queries:
        name = sql_query['name']

        for existing in queries_list:
            if existing['name'] == name:
                logging.error(['SQL-Query %s defined more than once'], name)
                sys.exit(ExitCodes.ERROR)

        # Looking for a specific query
        if query_name is not None:
            if name != query_name:
                continue

        namespace = sql_query['namespace']
        identifier = sql_query['identifier']

        # Due to an API limitation, the keys are coming with underscore
        # instead of period, so we are using this unpacking routine
        # to also replace "_" by "." in the keys
        if sql_query['overrides'] is not None:
            overrides = {
                key.replace('_', '.'): value
                for key, value in sql_query['overrides'].items()
                if value is not None
            }
        else:
            overrides = {}

        # Merging the overrides. Values that are still None after this
        # will be taken from the k8s secret on template rendering
        db_conn = {**db_conn_items, **overrides}

        # Output can be:
        # - stdout
        # - filesystem
        output = sql_query['output']
        if output is None:
            output = 'stdout'

        # Extracting the terraformResources information from the namespace
        # fo the given identifier
        tf_resource_info = get_tf_resource_info(namespace, identifier)
        if tf_resource_info is None:
            logging.error(['Could not find rds identifier %s in namespace %s'],
                          identifier, namespace['name'])
            sys.exit(ExitCodes.ERROR)

        sql_queries = []
        if sql_query['query'] is not None:
            sql_queries.append(sql_query['query'])

        if sql_query['queries'] is not None:
            sql_queries.extend(sql_query['queries'])

        sql_queries = [item.replace("'", "''") for item in sql_queries]

        # building up the final query dictionary
        item = {
            'name': name,
            'namespace': namespace,
            'identifier': sql_query['identifier'],
            'db_conn': db_conn,
            'output': output,
            'queries': sql_queries,
            **tf_resource_info,
        }

        # If schedule is defined
        # this should be a CronJob
        schedule = sql_query.get('schedule')
        if schedule:
            item['schedule'] = schedule

        queries_list.append(item)

    return queries_list