예제 #1
0
 def __init__(self, cfg_mgr):
     """Init."""
     self.cfg_mgr = cfg_mgr
     self.it_inventory = ITInventory(self.cfg_mgr)
     self.export_it_inventory = ExportITInventory(self.cfg_mgr)
     self.logger = get_logger(self.cfg_mgr)
     self.log_msg = ''
예제 #2
0
def create(tables_fh, cfg_mgr, timeout):
    """Start it table generation."""
    auto = ''
    manual = ''
    auto_fh = None

    if not timeout:
        timeout = 1800
    requests, msg, _ = parse_file_by_sections(tables_fh, '[Request]', REQ_KEYS,
                                              OPTIONAL_FIELDS)

    if msg:
        return auto_fh

    for request in requests:
        inv = ITInventory(cfg_mgr)
        db_table_dict = inv.get_table_mapping(
            request['source_database_name'].lower(),
            request['source_table_name'].lower(), request['db_env'].lower())
        if db_table_dict:
            it_table_obj = ItTable(db_table_dict, cfg_mgr)
        else:
            it_table_obj = ItTable(request, cfg_mgr)

        src_obj = get_src_obj(cfg_mgr, it_table_obj)
        status, it_table_str = src_obj.generate_it_table(timeout)

        if status == 'auto':
            auto += it_table_str + '\n'
        elif status == 'manual':
            manual += it_table_str + '\n'

    parent_dir = os.path.dirname(os.path.abspath(tables_fh.name))
    auto_file_path = parent_dir + '/AUTO_it-tables.txt'
    manual_file_path = parent_dir + '/MANUAL_it-tables.txt'
    src_obj.write_it_table_files(auto_file_path, auto)
    src_obj.write_it_table_files(manual_file_path, manual)

    if auto:
        auto_fh = open(auto_file_path, 'r')
    return auto_fh
예제 #3
0
 def setUpClass(cls, mock_connect):
     """Setup."""
     cls.cfg_mgr = ConfigManager(UNIT_TEST_ENV)
     cls.inventory = ITInventory(cls.cfg_mgr)
예제 #4
0
class RequestInventory(object):
    """Handles request file"""
    def __init__(self, cfg_mgr):
        """Init."""
        self.cfg_mgr = cfg_mgr
        self.it_inventory = ITInventory(self.cfg_mgr)
        self.export_it_inventory = ExportITInventory(self.cfg_mgr)
        self.logger = get_logger(self.cfg_mgr)
        self.log_msg = ''

    def parse_file(self, request_file):
        """
        Args:
            request_file: instance of open()
        Returns:
            list(ibis.inventory.request_inventory.Request)
        """
        requests, msg, log_msg = parse_file_by_sections(
            request_file, '[Request]', REQUIRED_FIELDS, OPTIONAL_FIELDS)
        self.logger.warning(log_msg)
        self.log_msg = log_msg
        temp_reqs = []
        if not msg:
            temp_reqs = [Request(req, self.cfg_mgr) for req in requests]
        return temp_reqs, msg

    def parse_file_export(self, request_file):
        """
        Args:
            request_file: instance of open()
        Returns:
            list(ibis.inventory.request_inventory.Request)
        """
        requests, msg, log_msg = parse_file_by_sections(
            request_file, '[Request]', REQUIRED_FIELDS_EXPORT,
            OPTIONAL_FIELDS_EXPORT)
        self.logger.warning(log_msg)
        self.log_msg = log_msg
        temp_reqs = []
        if not msg:
            temp_reqs = [Request(req, self.cfg_mgr) for req in requests]
        return temp_reqs, msg

    def get_available_requests(self, requests):
        """Given a list[{Request}] return a List[{ItTable}]
        of tables available, not on hold in the it table, and a
        List[{ItTable}] of tables on hold, due to a hold value
        of 1 and List[{Request}]
        Args:
            requests: list(ibis.inventory.request_inventory.Request) objects
        Returns:
            list(ibis.model.table.ItTable),
            list(ibis.model.table.ItTable),
            list(ibis.inventory.request_inventory.Request)
        """
        available_tables = []
        hold_tables = []
        unavailable_requests = []
        for req_obj in requests:
            src_db = req_obj.database
            src_table = req_obj.table_name
            if req_obj.db_env:
                db_env = req_obj.db_env
            else:
                db_env = self.cfg_mgr.default_db_env.lower()
            table = self.it_inventory.get_table_mapping(
                src_db, src_table, db_env)
            if table:
                # A record of the table exists in the it table
                if table['hold'] == 0:
                    available_tables.append(ItTable(table, self.cfg_mgr))
                else:
                    # hold = 1 means it is disabled temporarily
                    hold_tables.append(ItTable(table, self.cfg_mgr))
            else:
                # Record doesn't exist
                unavailable_requests.append(req_obj)
        if hold_tables:
            hold_tables_names = [table.table_name for table in hold_tables]
            msg = 'Tables: {0} are on hold'
            msg = msg.format(', '.join(hold_tables_names))
            self.logger.warning(msg)
        if unavailable_requests:
            unavail_names = [req.table_name for req in unavailable_requests]
            msg = 'Tables: {0} are missing in it_table'
            msg = msg.format(', '.join(unavail_names))
            self.logger.warning(msg)
        return available_tables, hold_tables, unavailable_requests

    def get_available_requests_export(self, requests):
        """Given a list[{Request}] return a List[{ItTableExport}]
        of tables available
        Args:
            requests: list(ibis.inventory.request_inventory.Request) objects
        Returns:
            list(ibis.model.table.ItTableExport),
            list(ibis.model.table.ItTableExport),
            list(ibis.inventory.request_inventory.Request)
        """
        tables = []
        unavailable_requests = []
        for req_obj in requests:
            src_db = req_obj.database
            src_table = req_obj.table_name
            if req_obj.db_env:
                db_env = req_obj.db_env
            else:
                db_env = self.cfg_mgr.default_db_env.lower()
            table = self.export_it_inventory.get_table_mapping(
                src_db, src_table, db_env)
            if table:
                # A record of the table exists in the it table
                tables.append(ItTableExport(table, self.cfg_mgr))
            else:
                # Record doesn't exist
                unavailable_requests.append(req_obj)
        if unavailable_requests:
            unavail_names = [req.table_name for req in unavailable_requests]
            msg = 'Tables: {0} are missing in it table'
            msg = msg.format(', '.join(unavail_names))
            self.logger.warning(msg)
        return tables, unavailable_requests
예제 #5
0
    def get_split(self):

        query = """select  databasename source_database_name,
        (tablename) source_table_name,
        columnname,
        case
         when indextype='P' and \
         indexnumber=1 then 2
         when indextype='P' and \
         indexnumber=2 then 4
         when indextype='Q' and \
         indexnumber=1 then 1
         when indextype='Q' and \
         indexnumber=2 then 3
         when indextype='S'  then 6
         when indextype='K' then 5
        else 7
        end as Split_By_Find
        from dbc.indices
        where
        databasename = '{db_name}'
        and tablename = '{table_name}'
        order by Split_By_Find"""

        db = self.db
        table = self.table

        server_name = filter(
            lambda server: server.lower() in self.jdbc_url.lower(),
            self.cfg_mgr.teradata_server)
        if server_name:
            server_name = self.cfg_mgr.teradata_server[server_name[0]]
            hdfs_query = """ select columnname from ibis.teradata_split_{0} \
            where lower(databasename) = '{1}' and lower(tablename) = '{2}'"""
            hdfs_query = hdfs_query.format(server_name, db.lower(),
                                           table.lower())
            run_query = ITInventory(self.cfg_mgr)
            results = run_query.get_rows(hdfs_query)
            if results:
                return results[0][0]
            else:
                self.logger.warning('No split_by found:\
                 {0}'.format(hdfs_query))
                return "no-split"
        else:
            query = query.format(table_name=table, db_name=db)
            returncode, output, err = self.eval(query)
            if returncode == 0:
                _, result = self.fetch_rows_sqoop(output)
                if result is None or len(result) == 0:
                    self.logger.warning('No split_by found: {0}'.format(query))
                    return "no-split"
                else:
                    if result[0][3] == '7':
                        int_bigint_query = """SELECT columnname
                        FROM
                          (SELECT columnname,
                                  rank() over (partition BY columntype
                                               ORDER BY columnid) rnk
                           FROM dbc.columns
                           WHERE tablename = '{table_name}'
                             AND databasename = '{db_name}'
                             AND columntype IN ('I',
                                                'I8') )a
                        WHERE rnk=1""".format(table_name=table, db_name=db)
                        returncode, output, err = self.eval(int_bigint_query)
                        if returncode == 0:
                            _, result = self.fetch_rows_sqoop(output)
                            if result is None:
                                self.logger.error("No split by assigned \
                                and one could not be found")
                                raise ValueError("No split by assigned \
                                and one could not be found")
                            if result:
                                result = result[0][0]
                                return result
                            else:
                                _msg = 'No split_by found: {0}'.format(query)
                                self.logger.warning(_msg)
                                return "no-split"
                        else:
                            self.logger.error(output)
                            self.logger.error(err)
                    else:
                        return result[0][2]
            else:
                self.logger.error(output)
                self.logger.error(err)

        raise ValueError("No split by assigned and one could not be found")