From 0383c19a1c0972aa84e89751cafcd56858b1bac1 Mon Sep 17 00:00:00 2001 From: William Brown Date: Mon, 20 Nov 2017 17:40:12 +0100 Subject: [PATCH 1/5] Ticket 49461 - Improve db2index handling for test 49290 Bug Description: db2index has limited parameters we can accept, including the types of attributes we can index. Specificatlly, we must take an index name, else we do not re-index (look at ns-slapd, we require -t or -T, and if we do, we require them to have a value. Fix Description: Fix lib389 to match the assertions of ns-slapd with regard to db2index behaviour. https://pagure.io/389-ds-base/issue/49461 Author: wibrown Review by: ??? --- dirsrvtests/tests/suites/basic/basic_test.py | 19 +++++++++ dirsrvtests/tests/tickets/ticket49290_test.py | 2 +- ldap/servers/slapd/main.c | 7 +++- src/lib389/lib389/__init__.py | 59 ++++++++++++++++++--------- 4 files changed, 66 insertions(+), 21 deletions(-) diff --git a/dirsrvtests/tests/suites/basic/basic_test.py b/dirsrvtests/tests/suites/basic/basic_test.py index 40ffde8..3fb51ea 100644 --- a/dirsrvtests/tests/suites/basic/basic_test.py +++ b/dirsrvtests/tests/suites/basic/basic_test.py @@ -366,6 +366,25 @@ def test_basic_backup(topology_st, import_example_ldif): log.info('test_basic_backup: PASSED') +def test_basic_db2index(topology_st, import_example_ldif): + """Assert db2index can operate correctly. + + :id: 191fc0fd-9722-46b5-a7c3-e8760effe119 + + :setup: Standalone instance + + :steps: + 1: call db2index + + :expectedresults: + 1: Index succeeds. + + """ + topology_st.standalone.stop() + topology_st.standalone.db2index() + topology_st.standalone.db2index(suffixes=[DEFAULT_SUFFIX], attrs=['uid']) + topology_st.standalone.start() + def test_basic_acl(topology_st, import_example_ldif): """Run some basic access control (ACL) tests diff --git a/dirsrvtests/tests/tickets/ticket49290_test.py b/dirsrvtests/tests/tickets/ticket49290_test.py index 72ba9f9..fcf6b0e 100644 --- a/dirsrvtests/tests/tickets/ticket49290_test.py +++ b/dirsrvtests/tests/tickets/ticket49290_test.py @@ -52,7 +52,7 @@ def test_49290_range_unindexed_notes(topology_st): 'nsIndexType' : 'eq', }) topology_st.standalone.stop() - topology_st.standalone.db2index(DEFAULT_BENAME) + assert topology_st.standalone.db2index(DEFAULT_BENAME, attrs=['modifytimestamp'] ) topology_st.standalone.start() # Now run the modifyTimestamp range query again. Assert that there is no diff --git a/ldap/servers/slapd/main.c b/ldap/servers/slapd/main.c index f8b591e..d53f431 100644 --- a/ldap/servers/slapd/main.c +++ b/ldap/servers/slapd/main.c @@ -2377,6 +2377,7 @@ slapd_exemode_db2index(struct main_config *mcfg) { int return_value = 0; struct slapdplugin *plugin; + char **instances = NULL; mapping_tree_init(); @@ -2385,7 +2386,7 @@ slapd_exemode_db2index(struct main_config *mcfg) * otherwise, we use included/excluded suffix list to specify a backend. */ if (NULL == mcfg->cmd_line_instance_name) { - char **instances, **ip; + char **ip; int counter; if (lookup_instance_name_by_suffixes(mcfg->db2ldif_include, mcfg->db2ldif_exclude, @@ -2456,6 +2457,10 @@ slapd_exemode_db2index(struct main_config *mcfg) slapi_pblock_destroy(pb); slapi_ch_free((void **)&(mcfg->myname)); + + charray_free(mcfg->db2ldif_include); + charray_free(instances); + return (return_value); } diff --git a/src/lib389/lib389/__init__.py b/src/lib389/lib389/__init__.py index 8a49df4..2c8c22d 100644 --- a/src/lib389/lib389/__init__.py +++ b/src/lib389/lib389/__init__.py @@ -41,7 +41,7 @@ import ldapurl import time import operator import shutil -import datetime +from datetime import datetime import logging import decimal import glob @@ -2780,34 +2780,55 @@ class DirSrv(SimpleLDAPObject, object): @param vlvTag - The VLV index name to index @return - True if reindexing succeeded """ - DirSrvTools.lib389User(user=DEFAULT_USER) - prog = os.path.join(self.ds_paths.sbin_dir, DB2INDEX) + prog = os.path.join(self.ds_paths.sbin_dir, 'ns-slapd') - if not bename and not suffixes: + if self.status(): + log.error("db2index: Can not operate while directory server is running") + return False + + if (not bename and not suffixes) and (attrs or vlvTag): log.error("db2index: missing required backend name or suffix") return False - cmd = '%s -Z %s' % (prog, self.serverid) + cmd = [prog,] + if attrs or vlvTag: + cmd.append('db2index') + else: + cmd.append('upgradedb') + cmd.append('-a') + now = datetime.now().isoformat() + cmd.append(os.path.join(self.get_bak_dir(), 'reindex_%s' % now)) + + cmd.append('-D') + cmd.append(self.get_config_dir()) + + if bename: - cmd = cmd + ' -n %s' % bename - if suffixes: + cmd.append('-n') + cmd.append(bename) + + # Can only use suffiix in attr only mode. + if suffixes and (attrs or vlvTag): for suffix in suffixes: - cmd = cmd + ' -s %s' % suffix + cmd.append('-s') + cmd.append(suffix) + if attrs: for attr in attrs: - cmd = cmd + ' -t %s' % attr + cmd.append('-t') + cmd.append(attr) + if vlvTag: - cmd = cmd + ' -T %s' % vlvTag + cmd.append('-T') + cmd.append(vlvTag) - self.stop(timeout=10) - log.info('Running script: %s' % cmd) - result = True - try: - os.system(cmd) - except: - log.error("db2index: error executing %s" % cmd) - result = False - self.start(timeout=10) + result = subprocess.check_output(cmd) + u_result = ensure_str(result) + + log.debug("db2index output: BEGIN") + for line in u_result.split("\n"): + log.debug(line) + log.debug("db2index output: END") return result -- 1.8.3.1