Github user njayaram2 commented on a diff in the pull request:

    https://github.com/apache/madlib/pull/271#discussion_r192199353
  
    --- Diff: src/madpack/madpack.py ---
    @@ -824,6 +873,246 @@ def parse_arguments():
         # Get the arguments
         return parser.parse_args()
     
    +def run_install_check(args, testcase):
    +    schema = args['schema']
    +    dbrev = args['dbrev']
    +    # 1) Compare OS and DB versions. Continue if OS = DB.
    +    if get_rev_num(dbrev) != get_rev_num(rev):
    +        _print_revs(rev, dbrev, con_args, schema)
    +        info_(this, "Versions do not match. Install-check stopped.", True)
    +        return
    +
    +    # Create install-check user
    +    test_user = ('madlib_' +
    +                 rev.replace('.', '').replace('-', '_') +
    +                 '_installcheck')
    +    try:
    +        _internal_run_query("DROP USER IF EXISTS %s;" % (test_user), False)
    +    except:
    +        _internal_run_query("DROP OWNED BY %s CASCADE;" % (test_user), 
True)
    +        _internal_run_query("DROP USER IF EXISTS %s;" % (test_user), True)
    +    _internal_run_query("CREATE USER %s;" % (test_user), True)
    +
    +    _internal_run_query("GRANT USAGE ON SCHEMA %s TO %s;" % (schema, 
test_user), True)
    +
    +    # 2) Run test SQLs
    +    info_(this, "> Running test scripts for:", verbose)
    +
    +    caseset = (set([test.strip() for test in testcase.split(',')])
    +               if testcase != "" else set())
    +
    +    modset = {}
    +    for case in caseset:
    +        if case.find('/') > -1:
    +            [mod, algo] = case.split('/')
    +            if mod not in modset:
    +                modset[mod] = []
    +            if algo not in modset[mod]:
    +                modset[mod].append(algo)
    +        else:
    +            modset[case] = []
    +
    +    # Loop through all modules
    +    for moduleinfo in portspecs['modules']:
    +
    +        # Get module name
    +        module = moduleinfo['name']
    +
    +        # Skip if doesn't meet specified modules
    +        if modset is not None and len(modset) > 0 and module not in modset:
    +            continue
    +        # JIRA: MADLIB-1078 fix
    +        # Skip pmml during install-check (when run without the -t option).
    +        # We can still run install-check on pmml with '-t' option.
    +        if not modset and module in ['pmml']:
    +            continue
    +        info_(this, "> - %s" % module, verbose)
    +
    +        # Make a temp dir for this module (if doesn't exist)
    +        cur_tmpdir = tmpdir + '/' + module + '/test'  # tmpdir is a global 
variable
    +        _make_dir(cur_tmpdir)
    +
    +        # Find the Python module dir (platform specific or generic)
    +        if os.path.isdir(maddir + "/ports/" + portid + "/" + dbver + 
"/modules/" + module):
    +            maddir_mod_py = maddir + "/ports/" + portid + "/" + dbver + 
"/modules"
    +        else:
    +            maddir_mod_py = maddir + "/modules"
    +
    +        # Find the SQL module dir (platform specific or generic)
    +        if os.path.isdir(maddir + "/ports/" + portid + "/modules/" + 
module):
    +            maddir_mod_sql = maddir + "/ports/" + portid + "/modules"
    +        else:
    +            maddir_mod_sql = maddir + "/modules"
    +
    +        # Prepare test schema
    +        test_schema = "madlib_installcheck_%s" % (module)
    +        _internal_run_query("DROP SCHEMA IF EXISTS %s CASCADE; CREATE 
SCHEMA %s;" %
    +                            (test_schema, test_schema), True)
    +        _internal_run_query("GRANT ALL ON SCHEMA %s TO %s;" %
    +                            (test_schema, test_user), True)
    +
    +        # Switch to test user and prepare the search_path
    +        pre_sql = '-- Switch to test user:\n' \
    +                  'SET ROLE %s;\n' \
    +                  '-- Set SEARCH_PATH for install-check:\n' \
    +                  'SET search_path=%s,%s;\n' \
    +                  % (test_user, test_schema, schema)
    +
    +        # Loop through all test SQL files for this module
    +        sql_files = maddir_mod_sql + '/' + module + '/test/*.sql_in'
    +        for sqlfile in sorted(glob.glob(sql_files), reverse=True):
    +            algoname = os.path.basename(sqlfile).split('.')[0]
    +            # run only algo specified
    +            if (module in modset and modset[module] and
    +                    algoname not in modset[module]):
    +                continue
    +
    +            # Set file names
    +            tmpfile = cur_tmpdir + '/' + os.path.basename(sqlfile) + '.tmp'
    +            logfile = cur_tmpdir + '/' + os.path.basename(sqlfile) + '.log'
    +
    +            # If there is no problem with the SQL file
    +            milliseconds = 0
    +
    +            # Run the SQL
    +            run_start = datetime.datetime.now()
    +            retval = _run_sql_file_install_check(schema, maddir_mod_py,
    +                                                 module, sqlfile, tmpfile,
    +                                                 logfile, pre_sql)
    +            # Runtime evaluation
    +            run_end = datetime.datetime.now()
    +            milliseconds = round((run_end - run_start).seconds * 1000 +
    +                                 (run_end - run_start).microseconds / 1000)
    +
    +            # Check the exit status
    +            result = _parse_result_logfile(retval, logfile, tmpfile, 
sqlfile,
    +                                           module, milliseconds)
    +
    +        # Cleanup test schema for the module
    +        _internal_run_query("DROP SCHEMA IF EXISTS %s CASCADE;" % 
(test_schema), True)
    +
    +    # Drop install-check user
    +    _internal_run_query("DROP OWNED BY %s CASCADE;" % (test_user), True)
    +    _internal_run_query("DROP USER %s;" % (test_user), True)
    +
    +def create_install_madlib_sqlfile(args, madpack_cmd, testcase):
    +    upgrade = args['upgrade']
    +    schema = args['schema']
    +    dbrev = args['dbrev']
    +    is_schema_in_db = args['is_schema_in_db']
    +    with open(args['output_filename'], 'a+') as output_filehandle:
    +        # COMMAND: uninstall/reinstall
    --- End diff --
    
    We created new functions for uninstall and install/reinstall.


---

Reply via email to