diff --git a/gpMgmt/bin/gppylib/test/unit/test_unit_gpconfig.py b/gpMgmt/bin/gppylib/test/unit/test_unit_gpconfig.py index 17c0be25e0d7e9f5c58abd8fd69ac6d1259f5526..26d44e37cec773ca974bd1bea712e116d5676aae 100644 --- a/gpMgmt/bin/gppylib/test/unit/test_unit_gpconfig.py +++ b/gpMgmt/bin/gppylib/test/unit/test_unit_gpconfig.py @@ -1,21 +1,20 @@ import base64 +import errno import imp import os import pickle +import shutil import sys import tempfile -from StringIO import StringIO - -import errno -from pygresql.pg import DatabaseError +from gppylib.gparray import Segment, GpArray, SegmentPair +from gppylib.gphostcache import GpHost +from gpconfig_modules.parse_guc_metadata import ParseGuc -from gparray import Segment, GpArray, SegmentPair -import shutil -from mock import * from gp_unittest import * -from gphostcache import GpHost -from gpconfig_modules.parse_guc_metadata import ParseGuc +from mock import * +from pygresql.pg import DatabaseError +from StringIO import StringIO db_singleton_side_effect_list = [] @@ -66,15 +65,18 @@ class GpConfig(GpTestCase): self.host_cache.get_hosts.return_value = [self.host] self.host_cache.ping_hosts.return_value = [] - self.master_read_config = Mock() - self.master_read_config.get_guc_value.return_value = "foo" - self.master_read_config.get_seg_content_id.return_value = -1 - self.segment_read_config = Mock() - self.segment_read_config.get_guc_value.return_value = "foo" - self.segment_read_config.get_seg_content_id.return_value = 0 + self.master_file = Mock(name='master') + self.master_file.get_value.return_value = 'foo' + self.master_file.segInfo.getSegmentContentId.return_value = -1 + self.master_file.segInfo.getSegmentDbId.return_value = 0 + + self.seg0_file = Mock(name='seg0') + self.seg0_file.get_value.return_value = 'foo' + self.seg0_file.segInfo.getSegmentContentId.return_value = 0 + self.seg0_file.segInfo.getSegmentDbId.return_value = 1 self.pool = Mock() - self.pool.getCompletedItems.return_value = [self.master_read_config, self.segment_read_config] + self.pool.getCompletedItems.return_value = [self.master_file, self.seg0_file] self.apply_patches([ patch('os.environ', new=self.os_env), @@ -127,6 +129,8 @@ class GpConfig(GpTestCase): @patch('sys.stdout', new_callable=StringIO) def test_option_show_with_port_will_succeed(self, mock_stdout): sys.argv = ["gpconfig", "--show", "port"] + + # mocked database values # select * from gp_toolkit.gp_param_setting('port'); ; # paramsegment | paramname | paramvalue # --------------+-----------+------------ @@ -175,7 +179,7 @@ class GpConfig(GpTestCase): self.subject.do_main() - self.pool.addCommand.assert_called_once_with(self.master_read_config) + self.pool.addCommand.assert_called_once() self.pool.join.assert_called_once_with() self.pool.check_results.assert_called_once_with() self.pool.haltWork.assert_called_once_with() @@ -186,8 +190,8 @@ class GpConfig(GpTestCase): @patch('sys.stdout', new_callable=StringIO) def test_option_f_will_report_absence_of_setting_on_master(self, mock_stdout): sys.argv = ["gpconfig", "--show", "my_property_name", "--file"] - self.master_read_config.get_guc_value.return_value = None - self.segment_read_config.get_guc_value.return_value = "seg_value" + self.master_file.get_value.return_value = None + self.seg0_file.get_value.return_value = "seg_value" self.subject.do_main() @@ -197,8 +201,8 @@ class GpConfig(GpTestCase): @patch('sys.stdout', new_callable=StringIO) def test_option_f_will_report_absence_of_setting_on_segment(self, mock_stdout): sys.argv = ["gpconfig", "--show", "my_property_name", "--file"] - self.master_read_config.get_guc_value.return_value = "master_value" - self.segment_read_config.get_guc_value.return_value = None + self.master_file.get_value.return_value = "master_value" + self.seg0_file.get_value.return_value = None self.subject.do_main() @@ -208,8 +212,8 @@ class GpConfig(GpTestCase): @patch('sys.stdout', new_callable=StringIO) def test_option_f_will_report_absence_of_setting_on_both(self, mock_stdout): sys.argv = ["gpconfig", "--show", "my_property_name", "--file"] - self.master_read_config.get_guc_value.return_value = None - self.segment_read_config.get_guc_value.return_value = None + self.master_file.get_value.return_value = None + self.seg0_file.get_value.return_value = None self.subject.do_main() @@ -219,12 +223,18 @@ class GpConfig(GpTestCase): @patch('sys.stdout', new_callable=StringIO) def test_option_f_will_report_difference_segments_out_of_sync(self, mock_stdout): sys.argv = ["gpconfig", "--show", "my_property_name", "--file"] - self.master_read_config.get_guc_value.return_value = 'foo' - self.segment_read_config.get_guc_value.return_value = 'bar' - another_segment_read_config = Mock() - another_segment_read_config.get_guc_value.return_value = "baz" - another_segment_read_config.get_seg_content_id.return_value = 1 - self.pool.getCompletedItems.return_value.append(another_segment_read_config) + + self.master_file.get_value.return_value = 'foo' + self.seg0_file.get_value.return_value = 'bar' + + seg_1 = Mock(name='seg1') + seg_1.segInfo.getSegmentContentId.return_value = 1 + seg_1.segInfo.getSegmentDbId.return_value = 2 + seg_1.get_value.return_value = 'baz' + + # mocked values in the files + self.pool.getCompletedItems.return_value.append(seg_1) + self.host_cache.get_hosts.return_value.extend([self.host, self.host]) self.subject.do_main() @@ -238,12 +248,18 @@ class GpConfig(GpTestCase): @patch('sys.stdout', new_callable=StringIO) def test_option_f_will_report_difference_segments_out_of_sync_when_unset(self, mock_stdout): sys.argv = ["gpconfig", "--show", "my_property_name", "--file"] - self.master_read_config.get_guc_value.return_value = 'foo' - self.segment_read_config.get_guc_value.return_value = 'bar' - another_segment_read_config = Mock() - another_segment_read_config.get_guc_value.return_value = None - another_segment_read_config.get_seg_content_id.return_value = 1 - self.pool.getCompletedItems.return_value.append(another_segment_read_config) + + self.master_file.get_value.return_value = 'foo' + self.seg0_file.get_value.return_value = 'bar' + + seg_1 = Mock(name='seg1') + seg_1.segInfo.getSegmentContentId.return_value = 1 + seg_1.segInfo.getSegmentDbId.return_value = 2 + seg_1.get_value.return_value = None + + # mocked values in the files + self.pool.getCompletedItems.return_value.append(seg_1) + self.host_cache.get_hosts.return_value.extend([self.host, self.host]) self.subject.do_main() @@ -258,6 +274,8 @@ class GpConfig(GpTestCase): db_singleton_side_effect_list.append("some happy result") entry = 'my_property_name' sys.argv = ["gpconfig", "-c", entry, "-v", "100", "-m", "20"] + + # mocked database values # 'SELECT name, setting, unit, short_desc, context, vartype, min_val, max_val FROM pg_settings' self.cursor.set_result_for_testing([['my_property_name', 'setting', 'unit', 'short_desc', 'context', 'vartype', 'min_val', 'max_val']]) @@ -279,6 +297,8 @@ class GpConfig(GpTestCase): db_singleton_side_effect_list.append("some happy result") entry = 'my_property_name' sys.argv = ["gpconfig", "-c", entry, "-v", "100", "--masteronly"] + + # mocked database values # 'SELECT name, setting, unit, short_desc, context, vartype, min_val, max_val FROM pg_settings' self.cursor.set_result_for_testing([['my_property_name', 'setting', 'unit', 'short_desc', 'context', 'vartype', 'min_val', 'max_val']]) @@ -329,17 +349,16 @@ class GpConfig(GpTestCase): @patch('sys.stdout', new_callable=StringIO) def test_option_file_compare_returns_same_value(self, mock_stdout): sys.argv = ["gpconfig", "-s", "my_property_name", "--file-compare"] - self.master_read_config.get_guc_value.return_value = 'foo' - self.master_read_config.get_seg_content_id.return_value = -1 - self.segment_read_config.get_guc_value.return_value = 'foo' - self.segment_read_config.get_seg_content_id.return_value = 0 + seg_1 = Mock(name='seg1') + seg_1.segInfo.getSegmentContentId.return_value = 1 + seg_1.segInfo.getSegmentDbId.return_value = 2 + seg_1.get_value.return_value = 'foo' - another_segment_read_config = Mock() - another_segment_read_config.get_guc_value.return_value = "foo" - another_segment_read_config.get_seg_content_id.return_value = 1 - self.pool.getCompletedItems.return_value.append(another_segment_read_config) + # mocked values in the files + self.pool.getCompletedItems.return_value.append(seg_1) + # mocked database values self.cursor.set_result_for_testing([[-1, 'my_property_name', 'foo'], [0, 'my_property_name', 'foo'], [1, 'my_property_name', 'foo']]) @@ -353,17 +372,19 @@ class GpConfig(GpTestCase): @patch('sys.stdout', new_callable=StringIO) def test_option_file_compare_works_with_unset_values(self, mock_stdout): sys.argv = ["gpconfig", "-s", "my_property_name", "--file-compare"] - self.master_read_config.get_guc_value.return_value = None - self.master_read_config.get_seg_content_id.return_value = -1 - self.segment_read_config.get_guc_value.return_value = None - self.segment_read_config.get_seg_content_id.return_value = 0 + self.master_file.get_value.return_value = None + self.seg0_file.get_value.return_value = None - another_segment_read_config = Mock() - another_segment_read_config.get_guc_value.return_value = None - another_segment_read_config.get_seg_content_id.return_value = 1 - self.pool.getCompletedItems.return_value.append(another_segment_read_config) + seg_1 = Mock(name='seg1') + seg_1.segInfo.getSegmentContentId.return_value = 1 + seg_1.segInfo.getSegmentDbId.return_value = 2 + seg_1.get_value.return_value = None + # mocked values in the files + self.pool.getCompletedItems.return_value.append(seg_1) + + # mocked database values self.cursor.set_result_for_testing([[-1, 'my_property_name', 'foo'], [0, 'my_property_name', 'foo'], [1, 'my_property_name', 'foo']]) @@ -377,20 +398,16 @@ class GpConfig(GpTestCase): @patch('sys.stdout', new_callable=StringIO) def test_option_file_compare_returns_different_value(self, mock_stdout): sys.argv = ["gpconfig", "-s", "my_property_name", "--file-compare"] - self.master_read_config.get_guc_value.return_value = 'foo' - self.master_read_config.get_seg_content_id.return_value = -1 - self.master_read_config.get_seg_dbid.return_value = 0 - self.segment_read_config.get_guc_value.return_value = 'foo' - self.segment_read_config.get_seg_content_id.return_value = 0 - self.segment_read_config.get_seg_dbid.return_value = 1 + seg_1 = Mock(name='seg1') + seg_1.segInfo.getSegmentContentId.return_value = 1 + seg_1.segInfo.getSegmentDbId.return_value = 2 + seg_1.get_value.return_value = 'bar' - another_segment_read_config = Mock() - another_segment_read_config.get_guc_value.return_value = "bar" - another_segment_read_config.get_seg_content_id.return_value = 1 - another_segment_read_config.get_seg_dbid.return_value = 2 - self.pool.getCompletedItems.return_value.append(another_segment_read_config) + # mocked values in the files + self.pool.getCompletedItems.return_value.append(seg_1) + # mocked database values self.cursor.set_result_for_testing([[-1, 'my_property_name', 'foo'], [0, 'my_property_name', 'foo'], [1, 'my_property_name', 'foo']]) @@ -408,20 +425,16 @@ class GpConfig(GpTestCase): @patch('sys.stdout', new_callable=StringIO) def test_option_file_compare_with_unset_values_on_some_segments(self, mock_stdout): sys.argv = ["gpconfig", "-s", "my_property_name", "--file-compare"] - self.master_read_config.get_guc_value.return_value = 'foo' - self.master_read_config.get_seg_content_id.return_value = -1 - self.master_read_config.get_seg_dbid.return_value = 0 - self.segment_read_config.get_guc_value.return_value = 'foo' - self.segment_read_config.get_seg_content_id.return_value = 0 - self.segment_read_config.get_seg_dbid.return_value = 1 + seg2_file = Mock(name='seg2') + seg2_file.segInfo.getSegmentContentId.return_value = 1 + seg2_file.segInfo.getSegmentDbId.return_value = 2 + seg2_file.get_value.return_value = None - another_segment_read_config = Mock() - another_segment_read_config.get_guc_value.return_value = None - another_segment_read_config.get_seg_content_id.return_value = 1 - another_segment_read_config.get_seg_dbid.return_value = 2 - self.pool.getCompletedItems.return_value.append(another_segment_read_config) + # mocked values in the files + self.pool.getCompletedItems.return_value.append(seg2_file) + # mocked database values self.cursor.set_result_for_testing([[-1, 'my_property_name', 'foo'], [0, 'my_property_name', 'foo'], [1, 'my_property_name', 'foo']]) @@ -439,20 +452,17 @@ class GpConfig(GpTestCase): @patch('sys.stdout', new_callable=StringIO) def test_option_file_compare_with_standby_master_with_different_file_value_will_report_failure(self, mock_stdout): sys.argv = ["gpconfig", "-s", "my_property_name", "--file-compare"] + + standby_master = Mock(name='standby_master') + standby_master.segInfo.getSegmentContentId.return_value = -1 + standby_master.segInfo.getSegmentDbId.return_value = 2 + standby_master.get_value.return_value = 'bar' + + # mocked values in the files + self.pool.getCompletedItems.return_value.append(standby_master) + + # mocked database values self.cursor.set_result_for_testing([[-1, 'my_property_name', 'foo']]) - self.master_read_config.get_guc_value.return_value = 'foo' - self.master_read_config.get_seg_content_id.return_value = -1 - self.master_read_config.get_seg_dbid.return_value = 0 - # standby mirror with bad file value - self.segment_read_config.get_guc_value.return_value = 'foo' - self.segment_read_config.get_seg_content_id.return_value = 0 - self.segment_read_config.get_seg_dbid.return_value = 1 - - standby_segment_read_config = Mock() - standby_segment_read_config.get_guc_value.return_value = "bar" - standby_segment_read_config.get_seg_content_id.return_value = -1 - standby_segment_read_config.get_seg_dbid.return_value = 2 - self.pool.getCompletedItems.return_value.append(standby_segment_read_config) self.subject.do_main() @@ -516,6 +526,8 @@ class GpConfig(GpTestCase): sys.argv = ["gpconfig", "--change", "my_property_name", "--value", value] if additional_args: sys.argv.extend(additional_args) + + # mocked database values self.cursor.set_result_for_testing([['my_property_name', 'setting', 'unit', 'short_desc', 'context', vartype, 'min_val', 'max_val']]) @@ -564,6 +576,8 @@ class GpConfig(GpTestCase): db_singleton_side_effect_list.append("some happy result") entry = 'my_property_name' sys.argv = ["gpconfig", "-c", entry, "-v", "100", "--masteronly"] + + # mocked database values # 'SELECT name, setting, unit, short_desc, context, vartype, min_val, max_val FROM pg_settings' self.cursor.set_result_for_testing([['my_property_name', 'setting', 'unit', 'short_desc', 'context', 'vartype', 'min_val', 'max_val']]) @@ -582,6 +596,8 @@ class GpConfig(GpTestCase): def test_gpconfig_logs_successful_guc_change(self): sys.argv = ["gpconfig", "-c", 'my_property_name', "-v", "100", "--masteronly"] + + # mocked database values self.cursor.set_result_for_testing([['my_property_name', 'setting', 'unit', 'short_desc', 'context', 'vartype', 'min_val', 'max_val']]) @@ -591,9 +607,11 @@ class GpConfig(GpTestCase): def test_gpconfig_logs_unsuccessful_guc_change(self): sys.argv = ["gpconfig", "-c", 'my_property_name', "-v", "100", "--masteronly"] + + # mocked database values self.cursor.set_result_for_testing([['my_property_name', 'setting', 'unit', 'short_desc', 'context', 'vartype', 'min_val', 'max_val']]) - self.segment_read_config.was_successful.return_value = False + self.seg0_file.was_successful.return_value = False self.subject.do_main() self.subject.LOGGER.error.assert_called_with("finished with errors, parameter string '-c my_property_name -v 100 --masteronly'")